几乎每一个Android项目中都会涉及到购买及支付,如微信支付,支付宝支付等。今天,仅针对微信支付来说,因为微信支付一不小心就会调不起登录和支付等errCode = -1的情况出现,令我们头疼不已。
微信支付调用流程是这样的:
1.用户在商户APP中选择商品,提交订单,选择微信支付。
2.商户后台收到用户支付单,调用微信支付统一下单接口。
3.统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。
4.商户APP调起微信支付。
5.商户后台接收支付通知。
6.商户后台查询支付结果。
首先,在调起微信支付之前,先在微信开放平台申请APPId(应用Id),mchId(商品号),appkey(密钥),其中Android需要包名和应用签名的。(应用签名的获取:release或debug数字签名证书的MD5签名值--在所在证书目录下执行命令 keytool -list -v -keystore "证书名" 即可获得MD5值。)
然后,是导入微信支付sdk的jar包。
接着是,需要先调用统一下单接口:
其中,接口链接:https://api.mch.weixin.qq.com/pay/unifiedorder
请求参数:
字段名 | 变量名 | 类型 | 必填 | 示例值 | 描述 |
应用ID | appid | string | 是 | wxd678efh567hg6787 | 微信开放平台审核通过的应用APPID |
商户号 | mch_id | string | 是 | 1230000109 | 微信支付分配的商户号 |
商品详情 | detail | string | 否 | ||
随机字符串 | nonce_str | string | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位(参考微信开放平台) |
签名 | sign | string | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 签名 |
商品描述 | body | string | 是 | 商品充值/支付 | 商品描述 |
商户订单号 | out_trade_no | string | 是 | 商户系统内部的订单号,32个字符内、可包含字母 | |
总金额 | total_fee | int | 是 | 支付总金额,单位为分,参数不能带小数 | |
终端IP | spbill_create_ip | string | 是 | 用户端实际ip | |
通知回调地址 | notify_url | string | 是 | 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数 | |
交易类型 | trade_type | string | 是 | APP | 支付类型 |
返回结果,判断return_code值是否为SUCEESS/FIAL。
若FAIL则查看return_msg错误原因。
若SUCCESS,
示例如下:
<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
<trade_type><![CDATA[APP]]></trade_type>
</xml>
调用支付,其请求参数:
字段名 | 变量名 | 类型 | 必填 | 描述 |
应用ID | appid | string | 是 | 微信开放平台审核通过的应用APPID |
商户号 | partnerid | string | 是 | 微信支付分配的商户号 |
预支付交易会话ID | prepayid | string | 是 | 微信返回的支付交易会话ID |
扩展字段 | package | string | 是 | |
随机字符串 | noncestr | string | 是 | 随机字符串 |
时间戳 | timeStamp | string | 是 | 时间戳 |
签名 | sign | string | 是 | 签名 |
注意!!这里必须要有wxapi这个包名,同时必须有WXPayEntryActivity这个类名,否则无法调起微信支付。在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。返回值,参考微信开放平台文档。
还有一点!!调不起微信,很可能的原因就是Sign签名有错!!