android中微信支付的流程(从请求统一支付接口到真正调起微信支付)

android中微信支付的流程(从请求统一支付接口到真正调起微信支付)

ID:15603890

大小:912.00 KB

页数:14页

时间:2018-08-04

上传者:xinshengwencai
android中微信支付的流程(从请求统一支付接口到真正调起微信支付)_第1页
android中微信支付的流程(从请求统一支付接口到真正调起微信支付)_第2页
android中微信支付的流程(从请求统一支付接口到真正调起微信支付)_第3页
android中微信支付的流程(从请求统一支付接口到真正调起微信支付)_第4页
android中微信支付的流程(从请求统一支付接口到真正调起微信支付)_第5页
资源描述:

《android中微信支付的流程(从请求统一支付接口到真正调起微信支付)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

Android中微信支付的流程(从请求统一支付接口到真正调起微信支付)在公司做一款电商类的软件,接入支付是必不可少的环节。继上一次集成支付宝以后,微信支付又开启了另一段痛苦的历程。由于以前没有做过微信支付,所以这次在做的过程中还是遇到很大的问题。而且,公司目前没有自己的后台,所有的接口都是外包来承接的,在遇到问题时,外包一般会说,这是封装好的,以前都没有问题。然后,你只能自己查找原因,废话不多说,简单记录一下集成微信的整个过程。1.微信支付的签名问题(包括微信的分享)  虽然关于微信的签名是个老生常谈的问题了,但是在这里我还是想要简单的描述一下.首先,要得到一个签名,你得先有一个自己的应用(Android版).这就需要你到微信的开放平台上申请一个帐号,然后认证你的开发资质(这一步是不是必须我不太清楚),最后创建一个应用,进行应用的审核(这里需要填写你的应用包名和签名,当然这个后期也是可以修改的.这里的签名你可以在androidstudio上先对你的module进行签名,然后可以在微信的网站上下一个查看签名的工具,安装到手机上,输入你应用的包名,就可以查看你应用的签名了.查看签名工具的下载地址:https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk).审核通过以后,你就可以拿到你的appid和你的appsecreat(应该是通过以后,当然也可能不是).然后,你就需要申请开通app支付的功能,这期间就需要你作为一个商户之类的一些认证啊之类的东西,都是比较繁琐的.这些完成以后,就可以准备进行支付了.2.导入微信支付的sdk不过我相信,即便你看了微信的官方文档,你依然不知道微信支付怎么集成,因为微信支付的官方文档简直太..... 如果你已经准备好了资源包,接下来正式开始集成我们需要的资源其实有以下几样,在开始前,就这些转备好吧1)微信支付的APPID2)微信支付依赖包>>>libammsdk.jar3)一个Activity类>>>WXPayEntryActivity.java这里需要特别说明一下,这个Activity类,直接从上下载到的范例代码中copy到自己的工程中即可,这个页面是在你调起微信支付完成支付(或取消或失败)后,再回到你的App时会调用的一个页面。页面的布局可以是你自定义的布局,直接放图讲解:先说一下这个类的路径,网上也有一大堆介绍了,我直接放图,路径一定,而且必须是这样的: 3.关于微信支付的请求统一接口以及二次签名在完成上述的步骤以后,发现在调起微信支付的时候,还是会出现闪退的情况.于是就猜测会不会是后台返回给我的参数有问题,在这里跟后台核实了appid,partnerid,appsecret等参数.最后无果,还是在后台的一句以前都没有问题下无疾而终.所以在这种情况下,只能自己向微信去请求数据来得到自己需要的数据了(其实我是不想这么做的,因为以前没有接触过微信支付,但是在远程后台懒得管的情况下,只能自己去验证了).3.1准备工作  在你请求微信的统一支付的接口时,有几个参数是必须的,微信的文档上已经罗列出来.  (1)appid应用的id例如:wxd678efh567hg6787  (2)mch_id商户的id例如:1230000109(申请开通支付功能关联的商户的id)  (3)nonce_str随机字符串例如:5K8264ILTKCH16CQ2502SI8ZNMTM67VS   生成随机字符串你需要写一个方法,例如://一个10000以内的随机整数,并进行MD5加密privateStringgetNonce_str(){returnMD5Utils.getMd5(newRandom().nextInt(10000)+"");}  (4)body商品描述例如:”ceshishangpin”(不确定这里是不是涉及到转码的问题,所以用的是字母)  (5)out_trade_no订单号例如:20150806125346(自家平台生成的订单号)  (7)spbill_create_ip终端ip例如:123.12.12.123(生成订单时设备的ip地址,我测试用的本机ip)  (8)notify_url通知地址例如:http://www.weixin.qq.com/wxpay/pay.php(这个地址还是要后台给你的,测试的话随便填也行吧应该,可以试试,不能包含特殊字符)  (9)trady_type交易类型例如:APP  (10)sign签名例如:C380BEC2BFD727A4B6845133519F3AD6(这是微信的第一次签名,在这里你又需要写到一个方法了,MD5Utils中是用的UTF-8的编码方式,请自行准备这个工具类)publicStringcreateSign(SortedMapparameters){StringBuffersb=newStringBuffer();Setes=parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)Iteratorit=es.iterator();while(it.hasNext()){Map.Entryentry=(Map.Entry)it.next();Stringk=(String)entry.getKey();Objectv=entry.getValue();if(null!=v&&!"".equals(v)&&!"sign".equals(k)&&!"key".equals(k)){sb.append(k+"="+v+"&");}}//这个partnerkey是需要自己进行设置的,要登陆你的微信的商户帐号(注意是商户,不是开放平台帐号),然后到api什么接口安全之类的那去设置,然后获取到sb.append("key="+Constant.WEIXIN_PARTERKEY);Log.e("TAG",sb.toString());Stringsign=MD5Utils.getMd5(sb.toString()).toUpperCase();Log.e("TAG","sign的值为"+sign);returnsign;}可能有人要问了,你这个集合是个什么东西呢?我就是在别人那抄过来的其实…..//参数:开始生成签名(这个类把这些参数封装到了一起)Unifiedorderunifiedorder=newUnifiedorder();finalSortedMapparameters=newTreeMap();parameters.put("appid",Constant.WEIXIN_APPID); unifiedorder.setAppid(Constant.WEIXIN_APPID);parameters.put("mch_id",Constant.WEIXIN_PARTERID);unifiedorder.setMch_id(Constant.WEIXIN_PARTERID);//上面提到的获取随机数的方法finalStringnonce_str=getNonce_str();parameters.put("nonce_str",nonce_str);unifiedorder.setNonce_str(nonce_str);parameters.put("body","ceshiweixinqianming");unifiedorder.setBody("ceshiweixinqianming");//order_id就是订单号parameters.put("out_trade_no",order_id);unifiedorder.setOut_trade_no(order_id);//总金额parameters.put("total_fee",1);unifiedorder.setTotal_fee("1");//ip地址parameters.put("spbill_create_ip","123.123.123.123");unifiedorder.setSpbill_create_ip("123.123.123.123");//支付成功的回调地址Stringnotify_url="http://www.baidu.com/xxxx";parameters.put("notify_url",notify_url);unifiedorder.setNotify_url(notify_url);parameters.put("trade_type","APP");unifiedorder.setTrade_type("APP");//这里就是用上面的方法生成的sign值了Stringsign=createSign(parameters);unifiedorder.setSign(sign);还是把这个封装的类贴出来吧,毕竟搬砖也是挺累的……//封装请求微信支付参数的bean类classUnifiedorder{privateStringappid;privateStringmch_id;privateStringnonce_str;privateStringsign;privateStringbody;privateStringout_trade_no;privateStringtotal_fee;privateStringspbill_create_ip;privateStringtime_start;privateStringnotify_url;privateStringtrade_type;publicStringgetAppid(){ returnappid;}publicvoidsetAppid(Stringappid){this.appid=appid;}publicStringgetMch_id(){returnmch_id;}publicvoidsetMch_id(Stringmch_id){this.mch_id=mch_id;}publicStringgetNonce_str(){returnnonce_str;}publicvoidsetNonce_str(Stringnonce_str){this.nonce_str=nonce_str;}publicStringgetSign(){returnsign;}publicvoidsetSign(Stringsign){this.sign=sign;}publicStringgetBody(){returnbody;}publicvoidsetBody(Stringbody){this.body=body;}publicStringgetOut_trade_no(){returnout_trade_no;}publicvoidsetOut_trade_no(Stringout_trade_no){ this.out_trade_no=out_trade_no;}publicStringgetTotal_fee(){returntotal_fee;}publicvoidsetTotal_fee(Stringtotal_fee){this.total_fee=total_fee;}publicStringgetSpbill_create_ip(){returnspbill_create_ip;}publicvoidsetSpbill_create_ip(Stringspbill_create_ip){this.spbill_create_ip=spbill_create_ip;}publicStringgetTime_start(){returntime_start;}publicvoidsetTime_start(Stringtime_start){this.time_start=time_start;}publicStringgetNotify_url(){returnnotify_url;}publicvoidsetNotify_url(Stringnotify_url){this.notify_url=notify_url;}publicStringgetTrade_type(){returntrade_type;}publicvoidsetTrade_type(Stringtrade_type){this.trade_type=trade_type;}} 好了,sign值也设置到bean类中了,下面要做的就是按照微信要求的格式把这个bean类中的信息传给他,这时候你又需要另外的一个方法了.//这个方法中需要注意的是,你在这个方法中拼接的参数,要和上面你已经赋给bean类的参数相一致,不能多也不能少,不然会出现签名错误的//请求微信的统一支付接口时需要用到的字符串信息StringxmlInfo=xmlInwww.shanxiwang.netfo(unifiedorder);//微信的统一支付接口的地址StringwxUrl="https://api.mch.weixin.qq.com/pay/unifiedorder";publicStringxmlInfo(Unifiedorderunifiedorder){if(unifiedorder!=null){StringBufferbf=newStringBuffer();bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");bf.append("");Log.e("TAG",bf.toString());returnbf.toString();}return"";}好了,按照微信要求的格式准备好字符串了,接下来就是向微信的接口地址请求数据了,我用的是okhttputilsOkHttpUtils.postString().content(xmlInfo).url(wxUrl).build().execute(newStringCallbwww.hunanwang.netack(){@OverridepublicvoidonError(Callcall,Exceptione,intid){}@OverridepublicvoidonResponse(Stringresponse,intid){//如果顺利的话,这里就可以获取到微信返回给我们的信息了,当然如果不顺利的话,检查一下前几步有没有错误吧....Log.e("TAG",response);}}微信返回给我们的是一个这样的字符串: 得到这个字符串以后,需要进行解析,并提取出来我们需要的信息,我是这么做的…//用来接收服务器返回的prepay_id参数Stringprepay_id="";Stringnonce_str="";//我到现在都不明白服务器返回给我这个值有毛用Stringsign="";XmlPullParserparser=Xml.newPullParser();StringReaderstringReader=newStringReader(response);try{parser.setInput(stringReader);inteventType=parser.getEventType();while(eventType!=XmlPullParser.END_DOCUMENT){StringnodeName=parser.getName();switch(eventType){caseXmlPullParser.START_TAG:if("prepay_id".equals(nodeName))prepay_id=parser.nextText();elseif("nonce_str".equals(nodeName)){nonce_str=parser.nextText();}elseif("sign".equals(nodeName)){sign=parser.nextText();}break;}//这一行代码不能丢,我把这丢了,然后,死循环了...eventType=parser.next();}}catch(Exceptione){e.printStackTrace(); }//关闭流..有用么?stringReader.close();好了,到这是不是觉得我们需要的参数都已经得到了?其实我起初也是这么想的..然而..还是会出现闪退..于是乎..想到了前辈们说的二次签名,然后查了一下,最后抱着试一试的心态……req.appId=Constant.WEIXIN_APPID;req.partnerId=Constant.WEIXIN_PARTERID;req.prepayId=prepay_id;req.packageValue="Sign=WXPay";req.nonceStr=nonce_str;//这是得到一个时间戳(除以1000转化成秒数)req.timeStamp=System.currentTimeMillis()/1000+"";//这个集合是上面用到的那个集合,因为我是写在一起的,就直接clear了一下接着用了,下面的这些就是二次签名parameters.clear();parameters.put("appid",Constant.WEIXIN_APPID);parameters.put("partnerid",Constant.WEIXIN_PARTERID);parameters.put("prepayid",prepay_id);parameters.put("noncestr",nonce_str);parameters.put("timestamp",req.timeStamp);parameters.put("package",req.packageValue);//调用获得签名的方法,这里直接把服务器返回来的sign给覆盖了,所以我不是很明白服务器为什么返回这个sign值,然后调起支付,基本上就可以了(我的反正是可以了....)sign=createSign(parameters);Log.e("TAG","timestamp====="+req.timeStamp);req.sign=sign;//在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信api.sendReq(req);  到这里,基本上我遇到的问题都解决完了,我觉得最大的问题还是因为没有后台的支持,需要自己对这些参数进行检验,而且从前没有进行过类似的工作.在此进行一下记录,希望对遇到同样问题的同学有所帮助.

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭