获取openid
步骤:
- 获取code
- 调用https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code获取openid,access_token等信息
1.获取code的方法:
步骤:
- 调用https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=redirect_uri&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect获得
详细代码:
getCode() {
// 获取code
// const redirect_uri='http://app.xxx.com/project'
const redirect_uri=window.location.href.replace(/[\?&]((code|state|from|pass_ticket|isappinstalled)=[^&#]+)/g,'').replace(/&&/g,'');
let appid = 'appid'
let state = parseInt(Math.random() * 1000);
const path=`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${encodeURIComponent(redirect_uri)}&response_type=code&scope=snsapi_userinfo&state=${state}#wechat_redirect`;
window.location.replace(path);
}
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 ) |
state | 是 | 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时候,必须带此参数 |
redirect_uri要是可用的地址,最好是线上的,不能使用本地地址,否则会提示redirect_uri参数错误
比如此例中redirect_uri为http://app.xxx.com/project为生产地址,访问此地址,执行getCode()方法之后,会提示授权,若已经授权过,则会自动跳转,跳转到http://app.xxx.com/project?code=001IovRQ1kOCa218wpQQ1sbURQ1IovRv&state=3536
此项目获取code的代码为:
// 此处可用window.location.search获取参数,判断是否含有code,并取得code的值
// 本人项目使用uniapp,所以使用options.code获得参数
if (options.code) {
this.getOpenId(options.code);
this.loadData(); // 获取页面展示数据
} else {
this.$api.getStorage('openid').then((res) => {
if (res.data) {
this.loadData(); // 获取页面展示数据
} else {
this.getCode(); // 获取code
}
}).catch((err) => {
this.getCode(); // 获取code
})
}
至此,就拿到code了
2. code换取openid,access_token等信息
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
获取openid,unionid,access_token
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的appsecret |
code | 是 | 上一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |
返回说明
正确时返回的JSON数据包如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID |
scope | 用户授权的作用域,使用逗号(,)分隔 |
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
注:访问这个地址获取openid等信息是会有跨域问题的,可以自己配置一下,或者一般这个是要后台小伙伴来完成的,直接调用后台小伙伴的接口就好了
获取unionid、昵称、头像等用户信息
https://api.weixin.qq.com/sns/userinfo?access_token=access_token&openid=openid&lang=zh_CN
参数说明
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
openid | 用户的唯一标识 |
lang | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
返回说明
正确时返回的JSON数据包如下:
{
"openid":" OPENID",
"nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNxxxxxx/46",
"privilege":["PRIVILEGE1" "PRIVILEGE2"],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 | 描述 |
---|---|
openid | 用户的唯一标识 |
nickname | 用户昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
province | 用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
privilege | 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |
关于unionid机制 (官网说明)
1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。
简单来说,就是用户要将公众号绑定到微信开放平台帐号, 并且同一个用户的多个应用中,unionid是相同的
注: 本人使用uniapp,调用此接口的时候获取的数据会有乱码问题,是因为请求的 header 中 content-type 默认为 application/json,
没有设置字符集,所以要手动设置一下,解决方法为
header: {
content-type: "application/json;charset=utf-8"
}
这个接口也是会有跨域问题的,可以自己配置一下,或者调用后台小伙伴的接口
检验授权凭证(access_token)是否有效
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
参数说明
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
openid | 用户的唯一标识 |
支付
支付流程:
- 生成订单
- 接口返回appId,nonceStr,package, signType, timeStamp,paySign信息
- 调用微信提供的接口支付
参数 | 描述 |
---|---|
appId | 公众号的唯一标识 |
timestamp | 支付签名时间戳 |
nonceStr | 支付签名随机串,不长于 32 位 |
package | 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) |
signType | 签名方式,默认为’SHA1’,使用新版支付需传入’MD5′ |
paySign | 支付签名 |
let that = this;
let sucCallback = function(res) {
that.nowOrderPay = false;
uni.redirectTo({
url: '/pages/money/paySuccess'
})
}
let failCallback = function(err) {
that.nowOrderPay = false;
uni.redirectTo({
url: '/pages/money/payFail'
})
}
let cancelCallback = function(err) {
that.nowOrderPay = false;
uni.redirectTo({
url: '/pages/money/payFail'
})
}
// wx_config:生成订单返回的信息,包含appId,nonceStr,package, signType, timeStamp,paySign信息
WXPay(wx_config, sucCallback, failCallback, cancelCallback)
WXPay 可以单独写一个文件,使用的地方导入
export function WXPay(wx_config, sucCallback, failCallback, cancelCallback) {
let pack = {
"appId":wx_config.appId,
"nonceStr": wx_config.nonceStr,
"package":wx_config.package,
"signType":wx_config.signType,
"timeStamp":wx_config.timeStamp,
"paySign":wx_config.paySign
}
function onBridgeReady(){
try{
uni.showLoading({
title: '正在发起支付..'
})
WeixinJSBridge.invoke(
'getBrandWCPayRequest',pack,
function(res){
uni.hideLoading();
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
uni.showToast({
title: '支付成功!'
})
sucCallback && sucCallback()
} else if(res.err_msg == "get_brand_wcpay_request:cancel" ){
uni.showToast({
title: '取消支付',
icon: 'none',
duration: 3000
})
failCallback && failCallback()
} else {
uni.showToast({
title: JSON.stringify(res),
icon: 'none',
duration: 3000
})
failCallback && failCallback()
}
}
);
}catch(ex){
uni.showToast({
title: '支付出现异常!' + JSON.stringify(res)
})
failCallback && failCallback()
}
}
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();
}
}
WeixinJSBridge 为微信浏览器内置对象,不用引入jweixin-x.x.x.js
关于手机号码:公众号没有像小程序那样,点击按钮获得加密数据,解密之后获得手机号,公众号可以调用后台接口获取手机号码
支付时提示“当前页面的URL为注册”
解决方法: 登录微信商户平台-产品中心-开发配置 添加公众号支付的支付授权目录,本里配置的支付目录为:app.xxx.com/project project为项目名(仅为示例,非真实可用)
今天的文章【记录】微信公众号开发之获取openid,unionid,用户信息等数据,支付分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/17100.html