上星期给公司的APP增加了一个微信支付的功能(怒草微信,别人家功能都很轻松添加,咋就你家的这么磨叽呢?),感觉就是个没啥技术含量,但是特别繁琐的东西,故在此记录以供日后查阅,
首先需要在微信开放平台申请使用相应支付接口时需要使用到的appid、appsecret(长度为32 的字符串,用于获取 access_token)、appkey(长度为 128 的字符串,用于支付过程中生成 app_signature)及 partnerkey(微信公众平台商户模块生成的商户密钥),具体申请过程不累述,需要注意的是:申请相应key应该使用你的app包名以及打包时所使用keystore的签名,不然无法调起微信。这个keystore的签名可以在打包时看到,微信开放平台亦有相关获取应用签名的工具。
文档建议appkey、appsecret、partnerkey不宜写在app端,那么需要用时就一股脑全都从服务器获取吧(为了安全,这里与服务器的通信数据做加密处理),
拿到以上几个key以后,调用接口获取access_token,看看文档即可知道如何获取,比较简单。之后根据获取的access_token加上PostData中格式为json的订单详细数据生成预支付订单,微信服务端返回prepayid,PoatData中,注意根据文档所述传入正确的键值,其中package以及app_signature这两个字段要仔细些传入,package字段中传入的值要注意在拼接的时候需要按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串. app_signature同理亦多加仔细。
最后,使用相应获取的参数调用微信完成支付即可,
req.appId = MainTools.getAppWechatAppId(mContext);<span style="white-space:pre"> </span>//开放平台申请所得appid
req.partnerId = partnerid;<span style="white-space:pre"> </span>//微信公众平台商户模块生成的商户密钥
req.prepayId = prepayid;<span style="white-space:pre"> </span>//使用access_token加上订单详细数据调用接口所得
req.nonceStr = noncestr;<span style="white-space:pre"> </span>//32位内的随机串,防止重发
req.timeStamp = String.valueOf(timestamp);<span style="white-space:pre"> </span>//时间戳,1970 年 1 月 1 日 00:00 到请求发起时间的秒数
req.packageValue = weixinpackage;<span style="white-space:pre"> </span>//"Sign=WXPay"
req.sign = MainTools.getSign(obj,mContext);<span style="white-space:pre"> </span>//app_signature
msgApi.sendReq(req);
返回结果。resp.errCode :err.Code == 0 //支付成功
err.Code == -1 //支付失败
err.Code == -2 //取消支付返回
检测是否安装微信以及当前版本的微信是否支持微信支付
if (! msgApi.isWXAppInstalled()) {
Toast.makeText(mContext, "未安装微信", Toast.LENGTH_LONG).show();
} else if (!msgApi.isWXAppSupportAPI()) {
Toast.makeText(mContext, "当前版本微信不支持支付功能", Toast.LENGTH_LONG).show();
}