大大文学网,杨丽玲图片,车城网
满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url。微信的支付demo并没有统一下单的代码。
读此文前先阅读: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
一步步的来 先根据统一下单的参数介绍工具:
1. 获取到当前的ip:
<span style="font-size:14px;">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 style="font-size:14px;">private string genouttradno() { random random = new random(); return md5.getmessagedigest(string.valueof(random.nextint(10000)).getbytes()); }</span>
3.签名工具:
<span style="font-size:14px;">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 style="font-size:14px;">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 style="font-size:14px;">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 style="font-size:14px;"> 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 style="font-size:14px;">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 style="font-size:14px;">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 style="font-size:14px;">private void sendpayreq() { msgapi.registerapp(constants.app_id); msgapi.sendreq(req); }</span>
其中:
<span style="font-size:14px;">constants.app_id</span>
是appid 在开发者平台获取
<span style="font-size:14px;"> req.partnerid = constants.mch_id;</span>
商户id
<span style="font-size:14px;">configutil.notify_url</span>
支付后的回调通知地址。
签名两次,然后用的api——key是商户平台api安全里面自定义的。
对了 还有个获取时间工具
<span style="font-size:14px;">private long gentimestamp() { return system.currenttimemillis() / 1000; }</span>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android apk 项目一键打包并上传到蒲公英的实现方法
Android 自定义LineLayout实现满屏任意拖动功能的示例代码
android 限制某个操作每天只能操作指定的次数(示例代码详解)
Android 集成 google 登录并获取性别等隐私信息的实现代码
网友评论