1 微信授权登陆
1) 配置授权回调页面域名
公众号开发平台->开发者中心->网页帐号->网页授权获取用户基本信息
2) 用户授权并获取code
参数 | 必须 | 说明 |
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息) |
state | 否 | 重定向后会带上state参数,开发者可以填写任意参数值 |
#wechat_redirect | 否 | 直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数 |
授权后重定向到 REDIRECT_URI?code=****
3) 根据code获取access_token、openId等用户信息
参数 | 是否必须 | 说明 |
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的appsecret |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |
返回:
参数 | 描述 |
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID |
scope | 用户授权的作用域,使用逗号(,)分隔 |
4) 使用access_token、openId获取用户信息
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数 | 描述 |
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
openid | 用户的唯一标识 |
返回:
参数 | 描述 |
openid | 用户的唯一标识 |
nickname | 用户昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
province | 用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 |
privilege | 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) |
2 调用微信js接口
微信开发文档说access_token的有效时间是7200秒(两小时);
但没有说过期后怎么办,这里的access_token容易和网页授权的access_token搞混;
后者有刷新地址,前者没有,需要过期后重新获取;
一般做网站开发,必须把access_token和jsapi_ticket存到服务器,并且根据过期时间定期更新,这个后期再说;
1) 获取access_token
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET
2) 获取临时票据 jsapi_ticket
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
3 微信公众号支付
1) 设置支付目录
确保实际支付时的请求目录与此处配置的目录一致,否则将无法成功唤起微信支付。
微信商户平台(pay.weixin.qq.com)-->产品中心-->开发配置
2) 设置授权域名
开发公众号支付时,在统一下单接口中要求必传用户openid,可在用户授权登陆时获取,需要配置网页授权域名(参:微信授权登陆)
3) js调起支付
getBrandWCPayRequest 接口
名称 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
公众号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 | 签名,详见签名生成算法 |
支付接口err_msg返回结果值:
返回值 | 描述 |
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();
}
4 获取access_token接口时,需要设置访问来源IP为白名单
微信分享时,发现报错
错误代码-40164,错误信息-invalid ip, not in whitelist hint: [59FKqA0797e514]]
登录公众平台,进入开发->基本配置页面->IP白名单配置