微信JSAPI支付

1.4.1 支付场景

商户已有H5 商城网站,在微信内打开网页时,可以调用微信支付完成下单购买的流程。

步骤(1):左图,商户下发图文消息或者通过自定义菜单吸引用户点击进入商户网页。

步骤(2):右图,进入家网页,用户选择购买,完成选购流程。

步骤(3):左图,调起微信支付控件,用户开始输入支付密码。

步骤(4):右图,密码验证通过,支付成功。商户后台得到支付成功的通知。

步骤(5):左图,返回商户页面,显示购买成功。该页面由商户自定义。

步骤(6):右图,公众号下发消息,提示发货成功。该步骤可选。

注意:商户也可以把商品网页的链接生成二维码,用户扫一扫打开后即可完成购买支付。

1.4.2 交互细节

以下是支付场景的交互细节,请认真阅读,并设计商户页面的逻辑:

(1 ) 用户打开商户网页选购商品, 发起支付, 在网页通过JavaScript 调用getBrandWCPayRequest 接口,发起微信支付请求,用户进入支付流程。

(2)用户成功支付点击完成按钮后,商户的前端会收到JavaScript 的返回值。商户可直接跳转到支付成功的静态页面进行展示。

(3)商户后台调用扫码支付查询接口,获取到支付状态,标志该笔订单支付成功。

注:(2)和(3)的触发不保证遵循严格的时序。JS API 返回值作为触发商户网页跳转的标志,但商户后台应该只在调用扫码支付查询接口,获取到支付状态后,才做真正的支付成功的处理。

JSAPI 返回值目前只在支付成功时返回,后续版本将扩展返回值,以便商户做更多个性化的展示。

1.4.3 获取微信当前版本

由于微信5.0 版本后才加入微信支付模块,低版本用户调用微信支付功能将无效。因此,建议商户通过user agent 来确定用户当前的版本号后再调用支付接口。以iPhone 版本为例,可以通过user agent 可获取如下微信版本示例信息:

“Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,likeGeocko) Mobile/9B206 MicroMessenger/5.0”

其中5.0 为用户安装的微信版本号,商户可以判定版本号是否高于或者等于5.0。

示例代码:

var wechatInfo = navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i) ;

if( !wechatInfo ) {

alert(“微信支付仅可在微信内发起”);

} else if ( wechatInfo[1] <“5.0”) {

alert(“您的微信版本小于5.0,请升级版本后再次尝试”);

}else{//TODO}

1.4.4 显示微信安全支付标题

对于商户具有支付权限且需要调用微信支付的页面,为了让用户增加购买信心,确认交易环境安全,微信强烈建议商户使用“微信安全支付”标题。安全支付标题的如下图。


显示支付安全标题,需将原始链接添加上”showwxpaytitle=1″的尾串。通过这种方式,商户的页面将出现微信安全支付的标识。例如,原始URL 为:htp://weixin.qq.com,显示安全支付标题的URL 为:htp://weixin.qq.com?showwxpaytitle=1。

当用户在微信里打开https://weixin.qq.com 不会直接出现微信安全支付的标题,而打开htp://weixin.qq.com?showwxpaytitle=1 后将出现微信安全支付标题。

1.4.5 JSAPI支付代码实现

接口需要注意:所有传入参数都是字符串类型!使用JavaScript、PHP 等弱类型语言需要关注一下,且使用浦发通道JSAPI支付时,无需以下代码,可将接口返回的 packjspayurl 参数值直接在页面打开。

WeixinJSBridge.invoke(‘getBrandWCPayRequest’,{ 

“appId”: appid,//微信公众号,扫码支付接口返回

“timeStamp”:timestamp, //时间戳,扫码支付接口返回

“nonceStr”: noncestr, //随机串,扫码支付接口返回

“package”: “prepay_id=”+prepayid,//预下单ID,扫码支付接口返回

“signType”: signType, //签名方式,扫码支付接口返回

“paySign”: paySign, //支付签名,扫码支付接口返回

},function(res){

if(res.err_msg == “get_brand_wcpay_request:ok”) {

//支付成功,可做页面上的跳转,订单状态要后台去轮询调用1.5扫码支付查询接口获得

}else if(res.err_msg == “get_brand_wcpay_request:cancel”){

//用户取消支付;

} else if(res.err_msg == “get_brand_wcpay_request:fail”){

//用户支付失败;

}}});

此文章有帮助吗?