前言
获取UnionID是开发微信公众号/小程序中很有必要的一个环节,特别是针对一个公司拥有多个公众号小程序而推出的机制,实现打通账户一体化,用UnionID来区分多平台的唯一性。
官方的解释:如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
相关公众号开发文章:
.NET Core 小程序开发零基础系列(1)——开发者启用并牵手成功
.NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)
.NET Core 微信小程序支付——(统一下单)
1
UnionID机制说明
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
2
UnionID获取的6种途径(代码实现)
UnionID获取的6种途径
调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login +
code2Session
获取到该用户 UnionID,无须用户再次授权。如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login +
code2Session
获取到该用户 UnionID ,无须用户再次授权。用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过
getPaidUnionId
接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。
小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。
第一种UnionID获取
调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
最常见的一种,很多同学应该用的这种。
流程:用户授权——获取密钥——后端解密——获取UnionID
开放平台绑定小程序如图:
前端授权获取密钥:
后端解密获取UnionID
varsettingItem = Senparc.Weixin.Config.SenparcWeixinSetting.Items[appID];
JsCode2JsonResult jsonResult = SnsApi.JsCode2Json(settingItem.WxOpenAppId, settingItem.WxOpenAppSecret, param.Code);
if (jsonResult.errcode != ReturnCode.请求成功)
{ return (false, jsonResult.errmsg);
} string unionID;
var encryptedData = Senparc.Weixin.WxOpen.Helpers.EncryptHelper.DecodeEncryptedData(jsonResult.session_key, param.EncryptedData, param.IV);
DecodedUserInfo decodedUserInfo = SerializerHelper.GetObject<DecodedUserInfo>(encryptedData);
unionID = decodedUserInfo.unionId;
第二种UnionID获取
如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。
流程:关注了公众号——获取UnionID
1、关注同一主体公众号就好了
2、获取UnionID,如下代码
varsettingItem = Senparc.Weixin.Config.SenparcWeixinSetting.Items[appID];
JsCode2JsonResult jsonResult = SnsApi.JsCode2Json(settingItem.WxOpenAppId, settingItem.WxOpenAppSecret, param.Code);
if (jsonResult.errcode != ReturnCode.请求成功)
{ return (false, jsonResult.errmsg);
} string unionID;
if (!jsonResult.unionid.IsNullOrEmpty())
{ unionID = jsonResult.unionid; Console.WriteLine($"unionID获取(无需解密):参数EncryptedData={param.EncryptedData},IV={param.IV},unionID={unionID}");
}
第三种UnionID获取
如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。
流程:与第二步流程类似,可以参数
第四种UnionID获取
用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。
流程:订单支付成功得到相应信息——通过接口请求getPaidUnionId得到UnionID
1、支付流程请参考:.NET Core 微信小程序支付——(统一下单)
2、通过接口请求getPaidUnionId得到UnionID
以下两种方式任选其一。
a、微信支付订单号(transaction_id)
https://api.weixin.qq.com/wxa/getpaidunionid?access_token=ACCESS_TOKEN&openid=OPENID&transaction_id=TRANSACTION_ID
b、微信支付商户订单号和微信支付商户号(out_trade_no 及 mch_id)
https://api.weixin.qq.com/wxa/getpaidunionid?access_token=ACCESS_TOKEN&openid=OPENID&mch_id=MCH_ID&out_trade_no=OUT_TRADE_NO
通过两个接口请求方式就可以得到UnionID
第五种UnionID获取
小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。
流程:关注了公众号——通过云函数获取UnionID
官方函数说明:
代码示例:
const cloud = require('wx-server-sdk')
exports.main = async (event, context) => { const { OPENID, APPID, UNIONID, ENV, } = cloud.getWXContext() return { OPENID, APPID, UNIONID, ENV, }
}
第六种UnionID获取
小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。
流程:与第五种类似,可以参数。
3
总结