前不久刚刚在APP应用中接入了微信支付,虽然是照着Demo做的,但是过程确实谈不上一帆风顺。网上一搜貌似抱怨微信支付坑多的着实不少。并且微信官网的API说明也并不是针对APP写的,部分细节会有出入,一个不不注意就会导致调试失败。最坑爹的是Appid校验,每次调试都要用签名key正式编译打包才行,我一个安装包50多M,打包一次要5分钟,你让我情何以堪。特别是好不容易打好包,一测试,挂了,当时的内心只剩下一万匹草泥马在狂奔。
这里把接入过程中容易忽略的问题和需要注意的细节给大家汇总一下,防止后来的同学重蹈覆辙,继续爬坑。
准备工作:
1、在微信开放平台申请APPID,并绑定应用包名和签名。这里没啥注意的,微信分享和第三方登录都需要的东西。
2、申请开通微信支付功能。默认微信支付时关闭的,需要申请开通。需要注意的是,申请完毕后,微信会发给你商户平台的账号、密码。需要登录该平台,在账户设置--API安全里设置API密钥,也就是后面要用到的API_KEY。这个Key是看不见的,忘记了只能重新设置,请自行牢记哦。
参数都准备完毕,可以开始对照Demo接入到自己的应用啦。
微信的支付流程简单归纳如下:
1、调用统一下单接口生成prepay_id。这一步就不知坑了多少英雄好汉。
注意规则:传递和解析参数都是XML格式,请照着demo做,不要瞎改;
参数名按照ASCII码从小到大排序(demo里的顺序就是对的所以还好);
参数名严格区分大小写;签名算法得出的sign值必须转为大写 。
支付金额必须为整数,单位是分,比方说支付1元,参数传入100
此外还有最最重要的一点,API里居然一字未提:当“body”参数值里包含中文时需要进行转码处理,否则一直返回-1(签名错误)你还找不到错在哪。解决方法,在body参数后面加一行代码
packageParams.add(new BasicNameValuePair("body", body));
packageParams.add(new BasicNameValuePair("input_charset", "UTF-8"));
然后在签名完成后返回xmlstring时转回来
String xmlstring =toXml(packageParams);
return new String(xmlstring.toString().getBytes(), "ISO8859-1"); 切记切记!
2、拿到prepay_id后调起微信支付。这里签名算法规则和下单时一样,一般都没什么问题啦。需要注意要使用注册的key签名打包应用才能成功调起微信支付,调试模式不行哦。
3、处理返回值。在指定位置写好WXPayEntryActivity并在AndroidManifest里配置好,就可以在onResp方法里拿到支付结果了。返回值有3种:0成功-1异常-2取消。这里建议拿到返回值后再调用查询订单接口检查一下支付状态。参数和签名规则同上,不再赘述。等确认支付状态为SUCCESS,OK大功告成。
除了这两个最重要的接口外,API里还有些其他有用的接口(关闭订单、申请退款、查询退款、对账单等)。这里就不再说明了,感兴趣的同学自行研究吧。