文档视界 最新最全的文档下载
当前位置:文档视界 › 微信支付开发文档

微信支付开发文档

微信支付开发文档
微信支付开发文档

微信支付开发文档

JSSDK接口调用步骤

步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

备注:登录后可在“开发者中心”查看对应的接口权限。

步骤二:引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):https://www.docsj.com/doc/c617536979.html,/open/js/jweixin-1.0.0.js

备注:支持使用 AMD/CMD 标准模块加载方法加载

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

debug: true,

appId:"wx971a7d2537b5fad3",

timestamp:1429064159,

nonceStr:"fc49306d97602c8ed1be1dfbf0835ead",//参数中S大写

signature:"ea11d1840ef6859386243bd1d00185d16b729f1c",

jsApiList: [

'checkJsApi',

'onMenuShareTimeline',

'onMenuShareAppMessage',

'onMenuShareQQ',

'onMenuShareWeibo',

'hideMenuItems',

'showMenuItems',

'hideAllNonBaseMenuItem',

'showAllNonBaseMenuItem',

'translateVoice',

'startRecord',

'stopRecord',

'onRecordEnd',

'playVoice',

'pauseVoice',

'stopVoice',

'uploadVoice',

'downloadVoice',

'chooseImage',

'previewImage',

'uploadImage',

'downloadImage',

'getNetworkType',

'openLocation',

'getLocation',

'hideOptionMenu',

'showOptionMenu',

'closeWindow',

'scanQRCode',

'chooseWXPay',

'openProductSpecificView',

'addCard',

'chooseCard',

'openCard'

]

});

其中签名signature由jsapi_ticket、noncestr、timestamp、url这4个参数生成。规则如下:

参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分)。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

注意事项:

1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。

2.签名用的url必须是调用JS接口页面的完整URL。

3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。

4.生成签名时,string1后面不需要商户密钥key的参与,参数全部小写(第一次签名)。

所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:

1.success:接口调用成功时执行的回调函数。

2.fail:接口调用失败时执行的回调函数。

https://www.docsj.com/doc/c617536979.html,plete:接口调用完成时执行的回调函数,无论成功或失败都会执行。

4.cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。

以上几个函数都带有一个参数,类型为对象,其中除了每个接口本身返回的数据之外,还有一个通用属性errMsg,其值格式如下:

1.调用成功时:"xxx:ok" ,其中xxx为调用的接口名

2.用户取消时:"xxx:cancel",其中xxx为调用的接口名

3.调用失败时:其值为具体错误信息

业务流程及步骤如下图:

步骤一:统一下单

如上图红线标注第4和第5步,通过活动详情生成支付订单,如下图:

点击微信支付,将订单信息传递至后台生成商户订单,并将订单参数组装成统一下单接口请求xml报文,调用接口获取预支付订单id(prepay_id),具体参数及xml格式如下:

公众账号ID appid 是String(3

2)

wx8888888888888888 微信分配的公众账号ID

商户号mch_id 是String(3

2)

1900000109 微信支付分配的商户号

设备号device_

info 否String(3

2)

013467007045764 终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"

随机字符串nonce_s

tr

是String(3

2)

5K8264ILTKCH16CQ2502SI8Z

NMTM67VS

随机字符串,不长于32位。推荐随机数生成算法

签名sign 是String(3

2) C380BEC2BFD727A4B6845133

519F3AD6

签名,详见签名生成算法

商品描述body 是String(3

2) Ipad mini 16G 白

商品或支付单简要描述

商品详情detail 否String(81

92) Ipad mini 16G 白

商品名称明细列表

附加数据attach 否String(12

7)

说明附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据

商户订单号out_tra

de_no

是String(3

2)

121775250120140703323336

8018

商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号

货币类型fee_typ

e 否String(1

6)

CNY 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型

总金额total_f

ee

是Int 888 订单总金额,只能为整数,详见支付金额

终端IP spbill_

create_

ip 是String(1

6)

8.8.8.8 APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。

交易起始时间time_st

art

否String(1

4)

20091225091010 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为2009122509

1010。其他详见时间规则

交易结束时间time_ex

pire

否String(1

4)

20091227091010 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为2009122709

1010。其他详见时间规则

商品标记goods_t

ag 否String(3

2)

WXG 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠

通知地址notify_

url 是String(25

6)

https://www.docsj.com/doc/c617536979.html,/ 接收微信支付异步通知回调地址

交易类型trade_t

ype 是String(1

6)

JSAPI 取值如下:JSAPI,NATIVE,APP,WAP,详细说明见参数规定

商品ID product

_id

String(3

2)

12235413214070356458058 trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。

用户标识openid 是String(12

8) oUpF8uMuAJO_M2pxb1Q9zNj

WeS6o

trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。下单前需要调用【网页授权获

取用户信息】接口获取到用户的Openid。

参数说明:

1、红色标注参数均为必填参数,即统一下单必须具备参数,否则无法成功。

2、必填参数中签名sign是由上述列表中除sign自身外所有参数+商户密钥key按照签名算法生成,其

中必填参数必须参与签名,非必填参数若其值非空,则参与签名,若为空则不参与签名。

3、生成签名参数字母全部小写(第二次生成签名)。

签名生成规则实例:

步骤一:对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串

appid=wx971a7d2537b5fad3&body=mianbaoshu&mch_id=1226904802&nonce_str=99BA5C4097C6B8FE F5ED774A1A6714B8¬ify_url=https://www.docsj.com/doc/c617536979.html,/wx/Pay_weixinpay&openid=oQSi4s-u_kZJ xPrOn839sjawTxrc&out_trade_no=34567812345345642344&spbill_create_ip=127.0.0.1&total_f ee=1&trade_type=JSAPI&key=tIPd6WIKOPcLpfKdqxzWtbJt9r0PjboT(商户密钥)

步骤二:对字符串进行MD5签名,得到sign:

sign签名:EA731F3B0034E5CF50A84E2595F24A23

请求xml报文

1

成功返回xml报文

成功获取prepay_id即统一下单结束。

请求参数如下图:

参数说明:

1、均为必填参数

2、Package参数值为统一下单获取prepay_id值,其值为:prepay_id=wx20150522111804ac0277a8fc0999773341

3、paySign由上述列表中出paySign自身外所有参数+商户密钥key按照签名规则生成

4、生成签名的参数中除package和商户密钥key采用小写字符外,appId、timeStamp、nonceStr、signType这个4个参数均采用

驼峰法命名,否则签名无效(第三次签名),如下图

签名实例如下:

appId=wx971a7d2537b5fad3&nonceStr=99BA5C4097C6B8FEF5ED774A1A6714B8&package=prepay_id= wx20150522111804ac0277a8fc0999773341&signType=MD5&timeStamp=1432264699&key=tIPd6WIKOP cLpfKdqxzWtbJt9r0PjboT

采用MD5编码得到paySign签名:A2A6BAF9378409EE850D2E65F0803856

将参数传入页面微信支付js接口发起支付

支付实例如下:

(1)函数1 wx.chooseWXPay({

timeStamp:1432264699,

nonceStr:"99BA5C4097C6B8FEF5ED774A1A6714B8",

package:"prepay_id=wx20150522111804ac0277a8fc0999773341",

signType:"MD5",

paySign:"A2A6BAF9378409EE850D2E65F0803856",

success: function (res) {

alert("发起支付请求成功!!");

alert(JSON.stringify(res));

},

fail:function(res){

alert('发起支付失败!');

}

});

});

(2)函数2 function onBridgeReady(){

WeixinJSBridge.invoke(

'getBrandWCPayRequest', {

"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入

"timeStamp":" 1432264699", //时间戳,自1970年以来的秒数

"nonceStr" : "99BA5C4097C6B8FEF5ED774A1A6714B8", //随机串

"package" : "prepay_id=wx20150522111804ac0277a8fc0999773341",

"signType" : "MD5", //微信签名方式:

"paySign" : "A2A6BAF9378409EE850D2E65F0803856"//微信签名

},

function(res){

if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。

}

);

}

说明:两个支付函数区别在于后面一个多出appid这个参数

附录1:常用公众平台信息

1、公众号appid

appid=wx971a7d2537b5fad3

2、公众号appid密钥

secret=c680a87935338c5526a2af801d5e4979

3、获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token)

6、商户平台密钥

key:tIPd6WIKOPcLpfKdqxzWtbJt9r0PjboT

设置如下图:

附录2:网页授权获取用户基本信息(获取openid)

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

关于网页授权回调域名的说明

1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;

2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:https://www.docsj.com/doc/c617536979.html,,配置以后此域名下面的页面https://www.docsj.com/doc/c617536979.html,/music.html、https://www.docsj.com/doc/c617536979.html,/login.html 都可以进行OAuth2.0鉴权。但https://www.docsj.com/doc/c617536979.html,、https://www.docsj.com/doc/c617536979.html,、https://www.docsj.com/doc/c617536979.html,无法进行OAuth2.0鉴权

3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可

关于网页授权的两种scope的区别说明

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

关于网页授权access_token和普通access_token的区别

1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;

2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

关于UnionID机制

1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(https://www.docsj.com/doc/c617536979.html,)绑定公众号后,才可利用UnionID机制来满足上述需求。

2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。

关于特殊场景下的静默授权

1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;

2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。

具体而言,网页授权流程分为四步:

1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权access_token(与基础支持中的access_token不同)

3、如果需要,开发者可以刷新网页授权access_token,避免过期

4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和

snsapi_userinfo),引导关注者打开如下页面:

https://https://www.docsj.com/doc/c617536979.html,/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

参考链接(请在微信客户端中打开此链接体验)

Scope为snsapi_base

https://https://www.docsj.com/doc/c617536979.html,/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=http%3A%2F%https://www.docsj.com/doc/c617536979.html,%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdap ter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect

Scope为snsapi_userinfo

https://https://www.docsj.com/doc/c617536979.html,/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%https://www.docsj.com/doc/c617536979.html,%2Foauth_response.php&response_typ e=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

参数说明

如果用户同意授权,页面将跳转至redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE

code说明:

code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

第二步:通过code换取网页授权access_token

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

请求方法

获取code后,请求以下链接获取access_token:

https://https://www.docsj.com/doc/c617536979.html,/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数说明

返回说明

正确时返回的JSON数据包如下:

{

"access_token":"ACCESS_TOKEN",

"expires_in":7200,

"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID",

"scope":"SCOPE",

"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"

错误时微信会返回JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

全局返回码说明

第三步:刷新access_token(如果需要)

由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。

请求方法

获取第二步的refresh_token后,请求以下链接获取access_token:

https://https://www.docsj.com/doc/c617536979.html,/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

返回说明

正确时返回的JSON数据包如下:

{

"access_token":"ACCESS_TOKEN",

"expires_in":7200,

"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID",

"scope":"SCOPE"

}

错误时微信会返回JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

全局返回码说明

第四步:拉取用户信息(需scope为snsapi_userinfo)

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

请求方法

http:GET(请使用https协议)

https://https://www.docsj.com/doc/c617536979.html,/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明

返回说明

正确时返回的JSON数据包如下:

{

"openid":" OPENID",

" nickname": NICKNAME,

"sex":"1",

"province":"PROVINCE"

"city":"CITY",

"country":"COUNTRY",

"headimgurl":

"https://www.docsj.com/doc/c617536979.html,/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[

"PRIVILEGE1"

"PRIVILEGE2"

],

"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"

}

错误时微信会返回JSON数据包如下(示例为openid无效): {"errcode":40003,"errmsg":" invalid openid "}

全局返回码说明

附:检验授权凭证(access_token)是否有效

请求方法

http:GET(请使用https协议)

https://https://www.docsj.com/doc/c617536979.html,/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID 参数说明

返回说明

正确的Json返回结果:

{ "errcode":0,"errmsg":"ok"}

错误时的Json返回示例:

{ "errcode":40003,"errmsg":"invalid openid"}

相关文档