手机上支付宝

支付宝能够在手机浏览器(非微信内置浏览器)上直接跳转到支付宝App,但发现微信无法实现、
支付宝的链接是这样的

1
2
3
4
5
#类似这样
https://mapi.alipay.com/gateway.do?_input_charset=utf-8&body=body
&notify_url=http://www.pangxieke.com/notify.php
&out_trade_no=6532997929&partner=2088911823643201
&payment_type=1&return_url=http://www.pangxieke.com/return.php

但是研究京东,发现是微信能够实现的。用二维码解码器分析其二维码,发现其链接类似于

1
2
3
weixin://wxpay/bizpayurl?sign=6425491f60bebd7893675fbf4f57545ec257e807&appid=wxbb46510af80cea38
&productid=1991516060115400000377053×tamp=1464766878
&noncestr=f127a3f714240273e254d740ed23f001

网上资料

网上找了很多资料,很多人都说无法实现。

  1. 微信支付的JSAPI支付方式可以从网页上发起支付,但是仅限于在微信内置浏览器中使用

  2. 是微信提供了一种直接从H5页面调起微信支付的模式https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1,接口参数做一点修改就可以了,只是开通这个支付权限比较麻烦,微信技术客服的回答是“需要有商务BD才可以开通”,貌似目前除了京东使用了这种支付方式外,其它用网页支付的都是微信JSAPI方式。

  3. 查看了京东网页端的源码后发现,京东最终在调微信支付的靠的就是这个URL:
    weixin://wap/pay?appid=wx799c7916b43b4282&noncestr=6rs6muegbzaodwao7sl76uomxx9s5vs6 &package=WAP&prepayid=wx20150922101123d1aea3ba1a0005507672&timestamp=1442888195 &sign=3B59AB4A84BDD3177CB55BB61D6C6408,
    参数是京东后台返回的。但是这个URL只能在京东的域名下点击才能调起微信支付控件,放在我的域名下貌似调起来了,但直接提示“系统繁忙,请稍后再试!”,估计是微信做了域名限制。我又把京东的微信账号换成自己的,重新生成预付单和签名信息,放在自己的域名下,还是提示“系统繁忙,请稍后再试!”,看起来确实像微信特地给京东开了这个后门,只能京东可以用,其他人用不了。

  4. 从APP发起的话会容易的多,从网页上发起就比较麻烦了,需要依赖微信的控件WeixinJSBridge,但是这个控件只在微信内置浏览器里才有,外部浏览器里没有,所以也就不能在外部浏览器发起微信支付

查看微信官方文档

发现最新文档是可以H5支付(非微信内浏览器支付),需要手机微信6.0.2
以下来着微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_3

场景:用户从非微信浏览器的站点导航,进入商户H5网页,用户挑选需购买商品,选择支付方式为微信支付,发起购买流程。

原理:使用deeplink链接

deeplink定义
商户server调用统一下单接口请求订单,api参见公共api【统一下单】(接口中trade_type需定义为WAP),微信会返回给商户prepayid,商户按固定格式生成deeplink,通过用户点击deeplink来调起微信支付。
deeplink格式:

1
2
3
weixin://wap/pay?appid%3Dwxf5b5e87a6a0fde94%26noncestr%3D123%26package%3D123%26
prepayid%3Dwx20141203201153d7bac0d2e10889028866%26
sign%3D6AF4B69CCC30926F85770F900D098D64%26timestamp%3D1417511263

生成deeplink 的步骤如下:

1:按URL 格式组装参数, $value 部分进行URL 编码,生成string1:
string1 : key1=Urlencode($value1)&key2=Urlencode($value2、&...

2:对string1 作整体的Urlencode,生成string2:
String2=Urlencode(string1);

3:拼接前缀,生成最终deeplink

举例如下:

String1:

1
2
3
4
5
appid=wxf5b5e87a6a0fde94&noncestr=123&package=WAP&prepayid=wx20141210163048
0281750c890475924233&sign=53D411FB74FE0B0C79CC94F2AB0E2333&timestamp=1417511263```
再对整个string1 做一次`URLEncode`

`string2:`

appid%3Dwxf5b5e87a6a0fde94%26noncestr%3D123%26package%3DWAP%26prepayid%3Dw
x201412101630480281750c890475924233%26sign%3D53D411FB74FE0B0C79CC94F2AB0E2
333%26timestamp%3D1417511263

1
2

再加上协议头weixin://wap/pay? 得到最后的`deeplink`

weixin://wap/pay?appid%3Dwxf5b5e87a6a0fde94%26noncestr%3D123%26package%3DW
AP%26prepayid%3Dwx201412101630480281750c890475924233%26sign%3D53D411FB74FE0
B0C79CC94F2AB0E2333%26timestamp%3D1417511263
```