公众号支付

API列表

场景介绍

  1. 商户通过下发图文消息或者自定义菜单吸引用户点击进入商户网页(商城网站)

  2. 选择商品,进入订单支付页面

  3. 点击支付按钮,调起微信支付控件(JSAPI)

  4. 用户点击确认支付,开始输入支付密码

  5. 密码通过验证,支付成功(余额充足)。商户后台异步得到支付成功的通知

  6. 返回商户界面,显示购买成功。注:该页面由商户自定义

  7. 微信官方公众号下发支付凭证

  8. 商户公众号下发消息,例如:提示发货成功(该步骤可选)

支付场景交互细节

  1. 用户打开商户网站选购商品,发起支付请求–>商户服务器调用统一下单API获取预下单prepay_id返回网页–>在网页通过javaScript调用getBrandWCPayRequest接口,发起支付请求,用户进入支付流程

  2. 用户成功支付后,点击完成按钮,商户的前端会收到JavaScript的返回值。商户可根据该返回值跳转到相应的页面进行展示

  3. 商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功

    2、3步骤不保证遵循严格的时序 异步

案例

  • 线下—饮料售卖机…

  • 线上—京东,淘宝,点赞猫…

开发步骤

一、设置支付目录

​ ==公众号支付在请求支付的时候会校验请求来源是否有在商户平台做了配置,所以必须确保支付目录已经正确的被配置,否则将验证失败,请求支付不成功。==

支付授权目录设置路径

​ 商户平台–>产品中心–>开发配置

​ 如果支付授权目录没有设置正确,在请求JSAPI时,会提示“当前页面的url未注册”的错误。

​ 故:根据这个错误我们就可以知道,支付授权目录需配置为当前支付页面的上一级

二、设置网页授权域名

​ 统一下单接口中要求必传openid参数,而获取openid需您在公众平台设置获取openid的域名,只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败。

​ ==用户在网页授权页同意授权给公众号后,微信会将授权数据传给一个回调页面,回调页面需在此域名下,以保证安全可靠==

业务流程

引用微信官方时序图

商户系统和微信支付系统主要交互:

1、商户server调用统一下单接口请求订单,api参见公共api【统一下单API

2、商户server接收支付通知,api参见公共api【支付结果通知API

3、商户server查询支付结果,api参见公共api【查询订单API

获取微信版本号
1
2
3
4
5
6
7
var wechatInfo = navigator.userAgent
.match(/MicroMessenger\/([\d\.]+)/i);
if (!wechatInfo) {
alert("本活动仅支持微信");
} else if (wechatInfo[1] < "5.0") {
alert("本活动仅支持微信5.0以上版本");
}

由于微信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,like Geocko) Mobile/9B206 MicroMessenger/5.0”

微信内H5调起支付

在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。

注意:WeixinJSBridge内置对象在其他浏览器中无效。

列表中参数名区分大小,大小写错误签名验证会失败。

getBrandWCPayRequest参数以及返回值定义:

1、网页端接口请求参数列表

名称 变量名 必填 类型 示例值 描述
公众号id appId String(16) wx8888888888888888 商户注册具有支付权限的公众号成功后即可获得
时间戳 timeStamp String(32) 1414561699 当前的时间,其他详见时间戳规则
随机字符串 nonceStr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
订单详情扩展字符串 package String(128) prepay_id=123456789 统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***
签名方式 signType String(32) MD5 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致
签名 paySign String(64) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法

参与签名参数为:appId、timeStamp、nonceStr、package、signType,请注意参数大小写。

2、返回结果值说明

返回值 描述
get_brand_wcpay_request:ok 支付成功
get_brand_wcpay_request:cancel 支付过程中用户取消
get_brand_wcpay_request:fail 支付失败
调用支付JSAPI缺少参数:total_fee 请检查预支付会话标识prepay_id是否已失效

注:JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回。由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分。

示例代码如下:

function onBridgeReady(){
WeixinJSBridge.invoke(
‘getBrandWCPayRequest’, {
“appId”:”wx2421b1c4370ec43b”, //公众号名称,由商户传入
“timeStamp”:”1395712654”, //时间戳,自1970年以来的秒数
“nonceStr”:”e61463f8efa94090b1f366cccfbbb444”, //随机串
“package”:”prepay_id=u802345jgfjsdfgsdg888”,
“signType”:”MD5”, //微信签名方式:
“paySign”:”70EA570631E4BB79628FBCA90534C63FF7FADD89” //微信签名
},
function(res){
if(res.err_msg == “get_brand_wcpay_request:ok” ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
}
);
}
if (typeof WeixinJSBridge == “undefined”){
if( document.addEventListener ){
document.addEventListener(‘WeixinJSBridgeReady’, onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent(‘WeixinJSBridgeReady’, onBridgeReady);
document.attachEvent(‘onWeixinJSBridgeReady’, onBridgeReady);
}
}else{
onBridgeReady();
}

微信收货地址共享

​ 地址共享是基于微信JavaScript API 实现,只能在微信内置浏览器中使用,其他浏览器调用无效。同时,需要微信5.0 版本才能支持

微信地址共享使用的数据字段:

  • 收货人姓名
  • 地区,省市区三级
  • 详细地址
  • 邮编
  • 联系电话
  • 其中,地区对应是国标三级地区码,如“广东省-广州市-天河区”,对应的邮编是510630

接口说明

编辑并获取收货地址

编辑并获取用户收货地址需以JS-SDK方式调用,在网页前端调用。JS-SDK调用步骤见说明文档,需按文档要求完成调用。

特别注意:JS-SDK版本需使用http://res.wx.qq.com/open/js/jweixin-1.1.0.js

代码示例

wx.openAddress({
success: function () {
// 用户成功拉出地址 },
cancel: function () {
// 用户取消拉出地址
}});

接口返回值 说明
errMsg 获取编辑收货地址成功返回“openAddress:ok”。
userName 收货人姓名。
postalCode 邮编。
provinceName 国标收货地址第一级地址(省)。
cityName 国标收货地址第二级地址(市)。
countryName 国标收货地址第三级地址(国家)。
detailInfo 详细收货地址信息。
nationalCode 收货地址国家码。
telNumber 收货人手机号码。
-------------本文结束感谢您的阅读-------------
您的支持将鼓励我继续创作...