生活随笔
收集整理的這篇文章主要介紹了
接入第三方SDK-微信支付
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
準(zhǔn)備工作:
首先去微信開(kāi)發(fā)者平臺(tái)中注冊(cè)好自己的應(yīng)用,并申請(qǐng)支付權(quán)限,得到appkey;且在
微信平臺(tái)中下載獲得簽名工具,輸入包名獲取簽名填寫(xiě)到開(kāi)發(fā)者平臺(tái)中去(這一步必須要有);導(dǎo)入微信的libs包libammsdk.jar;創(chuàng)建一個(gè)“應(yīng)用包名+wxapi“+包名的包;
//回調(diào)Actvity,用于支付后的回調(diào)
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, "未知錯(cuò)誤,請(qǐng)聯(lián)系客服");finish();}if("-2".equals(String.valueOf(resp.errCode))){(WXPayEntryActivity.this, "支付已取消");finish();}}}
}
/*** 因?yàn)槲⑿沤o的官方demo是連在一起的* 我現(xiàn)在把他拆開(kāi)來(lái),方便大家看的更清楚點(diǎn)*/private void WeiXinPay() {// TODO Auto-generated method stubUtils.showToast(context, "微信支付啟動(dòng)中...請(qǐng)稍后");GetPrepayIdTask getPrepayId = new GetPrepayIdTask();getPrepayId.execute();}
- 傳入商品信息數(shù)據(jù),生成訂單json數(shù)據(jù),這邊可以使用微信寫(xiě)好的方法;不過(guò),大家最好整理一下代碼;微信的源碼有點(diǎn)亂。
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(); //查看返回訂單數(shù)據(jù) Log.e("tag","resultunifiedorder=="+WeixinPay.resultunifiedorder);api.sendReq(WeixinPay.req);}@Overrideprotected void onCancelled() {super.onCancelled();}//這邊注意注釋下的這幾點(diǎn)@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”為訂單號(hào),自己服務(wù)器生成的,“a”為金額要轉(zhuǎn)換String格式(微信要* 求的),"HttpHelp.BuyCallback",為通知服務(wù)器回調(diào)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) {//實(shí)例化student對(duì)象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;}
- 序列化訂單數(shù)據(jù),用于生成xml訂單數(shù)據(jù),發(fā)送給微信調(diào)用起微信支付;
/*** 類(lèi)說(shuō)明:* @author MyT* @version 創(chuàng)建時(shí)間: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));//商戶(hù)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);//有轉(zhuǎn)碼錯(cuò)誤的風(fēng)險(xiǎn),參考其他人的做法要加上就可以了吧xml轉(zhuǎn)碼下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;}
}
- 最后注意一點(diǎn):一定要用正式包名,就是提交給微信的簽名去支付,否則會(huì)支付失敗;有許多人支付失敗,請(qǐng)先清理微信緩存,再進(jìn)行支付,這個(gè)問(wèn)題,微信也沒(méi)給出具體的解決方案,只叫我們?nèi)デ宄彺?#xff1b;
- 最好自己看一遍微信的文檔,雖然舊,但是看的懂大概就行;其他的工具類(lèi),全部是微信那邊提供下載的,這邊我就不提供了;^(* ̄(oo) ̄)^
總結(jié)
以上是生活随笔為你收集整理的接入第三方SDK-微信支付的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。