
满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url。微信的支付demo并没有统一下单的代码。
读此文前先阅读: https://pay.weixin.qq.com/wiki/doc/API/app/app.PHP?chapter=9_1
一步步的来 先根据统一下单的参数介绍工具:
1. 获取到当前的ip:
<span >public String getLocalipAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { } return null; } private String getWifiIp() { //获取wifi服务 WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); //判断wifi是否开启 if (!wifiManager.isWifIEnabled()) { wifiManager.setWifIEnabled(true); } WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); String ip = intToIp(ipAddress); return ip; } private String intToIp(int i) { return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + (i >> 24 & 0xFF); } </span> 2.随机订单号生成 test 你们可根据自己生成随机数:
<span >private String genOutTradNo() { Random random = new Random(); return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes()); }</span> 3.签名工具:
<span >private 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); this.sb.append("sign str\n"+sb.toString()+"\n\n"); String appSign = MD5.getMessageDigest(sb.toString().getBytes()); Log.e("orion",appSign); return appSign; }</span> 差不多了 现在我们需要生成传递的参数 参数要求是xml 格式的:
<span >private String genProductArgs() { StringBuffer xml = new StringBuffer(); String ip = getWifiIp(); if (ip == "" && ip == "") { ip = getLocalipAddress(); } try { String nonceStr = genNoncestr(); xml.append("</xml>"); List<nameValuePair> packageParams = new linkedList<nameValuePair>(); packageParams.add(new BasicnameValuePair("appID",Constants.APP_ID)); packageParams.add(new BasicnameValuePair("body","APP pay test")); packageParams.add(new BasicnameValuePair("mch_ID",Constants.MCH_ID)); packageParams.add(new BasicnameValuePair("nonce_str",nonceStr)); packageParams.add(new BasicnameValuePair("notify_url",ConfigUtil.NOTIFY_URL)); packageParams.add(new BasicnameValuePair("out_Trade_no",genOutTradNo())); packageParams.add(new BasicnameValuePair("spbill_create_ip",ip)); packageParams.add(new BasicnameValuePair("total_fee","1")); packageParams.add(new BasicnameValuePair("Trade_type","APP")); String sign = genPackageSign(packageParams); packageParams.add(new BasicnameValuePair("sign",sign)); String xmlstring =toXml(packageParams); return xmlstring; } catch (Exception e) { Log.e("TAG","fail,ex = " + e.getMessage()); return null; } }</span> 其中 toxml:
<span >private 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(); }</span> 得到传递的参数,根据文档指示,我们需要用post去吊连接URL地址:https://API.mch.weixin.qq.com/pay/unifIEdorder:
<span > private class GetPrepayIDTask extends AsyncTask<VoID,VoID,Map<String,String>> { private ProgressDialog dialog; @OverrIDe protected voID onPreExecute() { dialog = ProgressDialog.show(PayActivity.this,getString(R.string.app_tip),getString(R.string.getting_prepayID)); } @OverrIDe protected voID onPostExecute(Map<String,String> result) { if (dialog != null) { dialog.dismiss(); } sb.append("prepay_ID\n"+result.get("prepay_ID")+"\n\n"); resultunifIEdorder=result; } @OverrIDe protected voID onCancelled() { super.onCancelled(); } @OverrIDe protected Map<String,String> doInBackground(VoID... params) { String url = String.format("https://API.mch.weixin.qq.com/pay/unifIEdorder"); String entity = genProductArgs(); 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; } }</span> 其中decodexml就是:
<span >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; }</span> 下单完成,第二部就是给微信支付传递调起微信支付的参数(具体参数看文档说明):
<span >private voID genPayReq() { req.appID = Constants.APP_ID; req.partnerID = Constants.MCH_ID; req.prepayID = resultunifIEdorder.get("prepay_ID"); req.packageValue = "prepay_ID="+resultunifIEdorder.get("prepay_ID"); 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); sb.append("sign\n"+req.sign+"\n\n"); Log.e("orion",signParams.toString()); }</span> 第三部,调微信支付:
<span >private voID sendPayReq() { msgAPI.registerapp(Constants.APP_ID); msgAPI.sendReq(req); }</span> 其中:
<span >Constants.APP_ID</span>
是appID 在开发者平台获取
<span > req.partnerID = Constants.MCH_ID;</span>
商户ID
<span >ConfigUtil.NOTIFY_URL</span>
支付后的回调通知地址。
签名两次,然后用的API――key是商户平台API安全里面自定义的。
对了 还有个获取时间工具
<span >private long genTimeStamp() { return System.currentTimeMillis() / 1000; }</span> 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的android端微信支付V3版本地签名统一下单详解全部内容,希望文章能够帮你解决android端微信支付V3版本地签名统一下单详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)