日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接入第三方SDK-微信支付

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接入第三方SDK-微信支付 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

準備工作:

  • 首先去微信開發者平臺中注冊好自己的應用,并申請支付權限,得到appkey;且在
    微信平臺中下載獲得簽名工具,輸入包名獲取簽名填寫到開發者平臺中去(這一步必須要有);
  • 導入微信的libs包libammsdk.jar;
  • 創建一個“應用包名+wxapi“+包名的包;
  • //回調Actvity,用于支付后的回調 public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";private IWXAPI api;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.pay_result);api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {if("0".equals(String.valueOf(resp.errCode))){Utils.newInstance().showToast(WXPayEntryActivity.this, "支付成功");}if("-1".equals(String.valueOf(resp.errCode))){Utils.newInstance().showToast(WXPayEntryActivity.this, "未知錯誤,請聯系客服");finish();}if("-2".equals(String.valueOf(resp.errCode))){(WXPayEntryActivity.this, "支付已取消");finish();}}} }
    • 調用微信支付

    /*** 因為微信給的官方demo是連在一起的* 我現在把他拆開來,方便大家看的更清楚點*/private void WeiXinPay() {// TODO Auto-generated method stubUtils.showToast(context, "微信支付啟動中...請稍后");GetPrepayIdTask getPrepayId = new GetPrepayIdTask();getPrepayId.execute();}
    • 傳入商品信息數據,生成訂單json數據,這邊可以使用微信寫好的方法;不過,大家最好整理一下代碼;微信的源碼有點亂。
    private class GetPrepayIdTask extends AsyncTask<Void, Void, Map<String, String>> {@Overrideprotected void onPreExecute() {}@Overrideprotected void onPostExecute(Map<String, String> result) {WeixinPay.resultunifiedorder = result;WeixinPay.genPayReq(); //查看返回訂單數據 Log.e("tag","resultunifiedorder=="+WeixinPay.resultunifiedorder);api.sendReq(WeixinPay.req);}@Overrideprotected void onCancelled() {super.onCancelled();}//這邊注意注釋下的這幾點@Overrideprotected Map<String, String> doInBackground(Void... params) {//這邊微信使用已“分”為單位,這里要注意噢~~int a = (int) (Double.valueOf(fee) * 100);String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");/**“NO”為訂單號,自己服務器生成的,“a”為金額要轉換String格式(微信要* 求的),"HttpHelp.BuyCallback",為通知服務器回調url;*/String entity = WeixinPay.genProductArgs(NO, String.valueOf(a),HttpHelp.BuyCallback);Log.e("orion", entity);byte[] buf = Util.httpPost(url, entity);String content = new String(buf);Log.e("orion", content);Map<String, String> xml = decodeXml(content);return xml;}}public Map<String, String> decodeXml(String content) {try {Map<String, String> xml = new HashMap<String, String>();XmlPullParser parser = Xml.newPullParser();parser.setInput(new StringReader(content));int event = parser.getEventType();while (event != XmlPullParser.END_DOCUMENT) {String nodeName = parser.getName();switch (event) {case XmlPullParser.START_DOCUMENT:break;case XmlPullParser.START_TAG:if ("xml".equals(nodeName) == false) {//實例化student對象xml.put(nodeName, parser.nextText());}break;case XmlPullParser.END_TAG:break;}event = parser.next();}return xml;} catch (Exception e) {Log.e("orion", e.toString());}return null;}
    • 序列化訂單數據,用于生成xml訂單數據,發送給微信調用起微信支付;
    /*** 類說明:* @author MyT* @version 創建時間:20152015-10-8 下午5:00:40 */ public class WeixinPay {private static final String TAG = "MicroMsg.SDKSample.WeixinPay";public static Map<String,String> resultunifiedorder=new HashMap<String, String>();public static PayReq req=new PayReq();public static String genProductArgs(String name, String total,String url) {StringBuffer xml = new StringBuffer();try {String nonceStr = genNonceStr();xml.append("</xml>");List<NameValuePair> packageParams = new LinkedList<NameValuePair>();packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));//微信appidpackageParams.add(new BasicNameValuePair("body", "*******"));//商品備注packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));//商戶IDpackageParams.add(new BasicNameValuePair("nonce_str", nonceStr));packageParams.add(new BasicNameValuePair("notify_url", url));packageParams.add(new BasicNameValuePair("out_trade_no",name));packageParams.add(new BasicNameValuePair("spbill_create_ip","127.0.0.1"));packageParams.add(new BasicNameValuePair("total_fee", total));packageParams.add(new BasicNameValuePair("trade_type", "APP"));String sign = genPackageSign(packageParams);packageParams.add(new BasicNameValuePair("sign", sign));String xmlstring =toXml(packageParams);//有轉碼錯誤的風險,參考其他人的做法要加上就可以了吧xml轉碼下return new String(xmlstring.toString().getBytes(), } catch (Exception e) {Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());return null;}}public static String genNonceStr() {Random random = new Random();return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());}public static String genOutTradNo() {Random random = new Random();return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());}/** 生成簽名*/public static String genPackageSign(List<NameValuePair> params) {StringBuilder sb = new StringBuilder();for (int i = 0; i < params.size(); i++) {sb.append(params.get(i).getName());sb.append('=');sb.append(params.get(i).getValue());sb.append('&');}sb.append("key=");sb.append(Constants.API_KEY);String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();Log.e("orion",packageSign);return packageSign;}public static String toXml(List<NameValuePair> params) {StringBuilder sb = new StringBuilder();sb.append("<xml>");for (int i = 0; i < params.size(); i++) {sb.append("<"+params.get(i).getName()+">");sb.append(params.get(i).getValue());sb.append("</"+params.get(i).getName()+">");}sb.append("</xml>");Log.e("orion",sb.toString());return sb.toString();}public static void genPayReq() {req.appId = Constants.APP_ID;req.partnerId =Constants.MCH_ID;req.prepayId =WeixinPay.resultunifiedorder.get("prepay_id");req.packageValue ="Sign=WXPay";req.nonceStr = genNonceStr();req.timeStamp = String.valueOf(genTimeStamp());List<NameValuePair> signParams = new LinkedList<NameValuePair>();signParams.add(new BasicNameValuePair("appid", req.appId));signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));signParams.add(new BasicNameValuePair("package", req.packageValue));signParams.add(new BasicNameValuePair("partnerid", req.partnerId));signParams.add(new BasicNameValuePair("prepayid", req.prepayId));signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));req.sign = genAppSign(signParams);Log.e("orion", signParams.toString());}public static long genTimeStamp() {return System.currentTimeMillis() / 1000;}public static String genAppSign(List<NameValuePair> params) {StringBuilder sb = new StringBuilder();for (int i = 0; i < params.size(); i++) {sb.append(params.get(i).getName());sb.append('=');sb.append(params.get(i).getValue());sb.append('&');}sb.append("key=");sb.append(Constants.API_KEY);String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();Log.e("orion",appSign);return appSign;} }
    • 最后注意一點:一定要用正式包名,就是提交給微信的簽名去支付,否則會支付失敗;有許多人支付失敗,請先清理微信緩存,再進行支付,這個問題,微信也沒給出具體的解決方案,只叫我們去清除緩存;
    • 最好自己看一遍微信的文檔,雖然舊,但是看的懂大概就行;其他的工具類,全部是微信那邊提供下載的,這邊我就不提供了;^(* ̄(oo) ̄)^

    總結

    以上是生活随笔為你收集整理的接入第三方SDK-微信支付的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。