业务流程

微信支付大致流程 点击打开链接

App主要负责部分:

1. 先向微信官网申请应用,通过微信签名工具将项目的包名通过keystore申请签名,这个签名需提交给微信官网。如果改签名与提交的不符将无法条用app的微信支付功能。商户申请需要公司的一些相关证件并交300元认证费用来获取:微信支付商号,appid后面服务器生成的支付订单需要用到这两个元素。

2.WXAPI api = WXAPIFactory.createWXAPI(context, null);

// 将该app注册到微信

api.registerApp(appid);

3. 统一下单

<xml>
<appid>wx2421b1c4370ec43b</appid>
<attach>附加数据</attach>
<body>商品描述</body>
<mch_id>10000100</mch_id>
<nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
<notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
<out_trade_no>1415659990</out_trade_no>
<spbill_create_ip>14.23.150.211</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>APP</trade_type>
<sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>

微信的接口链接:https://api.mch.weixin.qq.com/pay/unifiedorder

 

 

4.调起支付

PayReq request = new PayReq();

request.appId = "wxd930ea5d5a258f4f";

request.partnerId = "1900000109";

request.prepayId= "1101000000140415649af9fc314aa427",;

request.packageValue = "Sign=WXPay";

request.nonceStr= "1101000000140429eb40476f8896f4c9";

request.timeStamp= "1398746574";

request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";

api.sendReq(request);

红字部分是需要后台实现的,因为这涉及到了安全性

partnerId是我们后台和微信支付后台进行数据交互后返回的支付交易会话ID

Sign如何生成

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA

特别注意以下重要规则:

1. 参数名ASCII码从小到大排序(字典序);

2. 如果参数的值为空不参与签名;

3. 参数名区分大小写;

4. 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。

5. 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到signsignValue

key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->**设置

举例:

假设传送的参数如下:

appidwxd930ea5d5a258f4f

mch_id10000100

device_info1000

bodytest

nonce_stribuaiVcKdpRxkhJA

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

第二步:拼接API**:

stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的**key 

sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式

sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6"//注:HMAC-SHA256签名方式

最终得到最终发送的数据:

<xml>

<appid>wxd930ea5d5a258f4f</appid>

<mch_id>10000100</mch_id>

<device_info>1000</device_info>

<body>test</body>

<nonce_str>ibuaiVcKdpRxkhJA</nonce_str>

<sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>

</xml>

 

5. 回调结果

在支付界面实现微信的IWXAPIEventHandler接口。支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:

public void onResp(BaseResp resp) {

resp.errCode

}


返回的错误码解析:

微信支付大致流程




代码下载链接:

点击打开链接


 

相关文章:

  • 2021-12-17
  • 2021-10-02
  • 2022-01-22
  • 2021-12-23
  • 2021-12-05
  • 2021-12-05
  • 2021-12-24
  • 2021-07-11
猜你喜欢
  • 2021-10-28
  • 2021-10-20
  • 2021-10-04
  • 2021-08-29
  • 2022-12-23
  • 2022-01-20
相关资源
相似解决方案