第一步:开放平台上添加 获取会员手机号的功能包(需要主账号签约,子账号不可见)
https://open.alipay.com/operation/mini/ops/mini-summary
第二步:添加主动触发按钮
getPhoneNumber:授权成功后的回调
onAuthError:拒绝授权后的回调
<button open-type="getAuthorize" onGetAuthorize="getPhoneNumber" onError="onAuthError" scope='phoneNumber'>登录/注册</button>
第三步:获取授权码 发送到服务器后台
my.getPhoneNumber({
success: (res) => {
let encryptedData = JSON.parse(res.response).response;
//userObject.phoneInfo = res.response;
console.log(res.response);
//手机号解密请求
phoneAuth(res.response);
},
fail: (res) => {
console.log(res);
}
});
function phoneAuth(e){
//后台请求操作 主要是发送加密数据
}
第四步:后台解析(低版本SDK:https://download.youkuaiyun.com/download/qq_36894527/12875709)
//应用公钥
public static string PublicKey = "";
//aes密钥
public static string AESKey = "";
/// <summary>
/// 手机号解密
/// </summary>
/// <param name="openapiResult"></param>
/// <returns></returns>
public static string Decypt(string openapiResult, string publicKey, string aesKey)
{
//openapiResult= "{\"response\":\"9+asiPElYO6D9jVY21115q6WIe7Lobo0vIbP5D9l0hwmHERiIhu/jsMKoWX4PdJd05BUOLL0xSFazUut+4JH2udCwOaZVJcbT9/sJgMhAavSYGUDyKB3bffXRgDLRKBL+PGcnPD6JjQUgGOM9JPFxOBwmD0U0Ylo1GDagR9pjZjtAyFzAcJYDkGrOKTpsO9nTn2MFHfkUNikX/q1gPOehUiUnvb3ZqcPVs4rEb7M5xpgoBcc/eht+zpMBLFShaBpY3BtQluHxaTeEtT3a66G/SmcoJ0yBCt1z78ZQVy9pmStMgDnmVINArQz/O2XrPUakN3TszH9U1qnoJ5C8LSu/CsS0E8XApSu1iERQjKfJlg=\",\"sign\":\"KyQCYndlwsunFXOivUJGHdg88M4HyxtucizmGarsmvc+uUVOSuQlHhnYa3iKWkVxTv76Y75JJuiZP5wSqnfU0jjln27Xi0BSh2JPTF/4oIBJlrqQxsw9bVkzaGu5bkB+Tw4sZQwO8vgg8Z7f8bu6go/BWAEd5m4ds5haTQ9enH5ZDjb7S08EJbYLe9Nnz/BJbv0M1lbW60nGr5QyDFvmnE91g2U1NhAKaZewjIm/7xsFYlQ7xh68A+fEkr4TIzA7scILGncnmQ+mU3B98I5njiTzhxig+pByCGkY2vT3U6z+4VUFUuB0+bwOBNqYp++bXQs/cAhcv+7FV/yW4Qm+9w==\"}";
//小程序通过 my.getPhoneNumber 获取到加密数据,详见获取会员手机号接入文档
string res = "";
JObject jObj = null;
//1. 获取验签和解密所需要的参数
try
{
jObj = (JObject)JsonConvert.DeserializeObject(openapiResult);
}
catch (Exception ex)
{
throw new Exception("获取验签和解密所需要的参数失败", ex);
}
string signType;
if (openapiResult.Contains("sign_type"))
{
signType = jObj["sign_type"].ToString();
}
else
{
signType = "RSA2";
}
string charset;
if (openapiResult.Contains("charset"))
{
charset = jObj["charset"].ToString();
}
else
{
charset = "UTF-8";
}
string encryptType;
if (openapiResult.Contains("encrypt_type"))
{
encryptType = jObj["encrypt_type"].ToString();
}
else
{
encryptType = "AES";
}
string sign = jObj["sign"].ToString();
string content = jObj["response"].ToString();
//如果密文的
bool isDataEncrypted = !content.StartsWith("{", StringComparison.Ordinal);
bool signCheckPass = false;
//2. 验签
string signContent = content;
//RSA2支付宝公钥(不是应用公钥),在控制台-小程序-开发设置-开发设置-接口加签方式-设置/查看
string signVeriKey = publicKey;
//填小程序设置的AES密钥。注意:若AES密钥中存在反斜杠"\\"会导致解密报错,需删除反斜杠或更改没有反斜杠的AES密钥
string decryptKey = aesKey;
//如果是加密的报文则需要在密文的前后添加双引号
if (isDataEncrypted)
{
signContent = "\"" + signContent + "\"";
}
try
{
signCheckPass = AlipaySignature.RSACheckContent(signContent, sign, signVeriKey, charset, signType, false);
Console.WriteLine("RSA2验签结果:" + signCheckPass);
}
catch (Exception ex)
{
//验签异常, 日志
throw new Exception("验签失败", ex);
}
if (!signCheckPass)
{
//验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
throw new Exception("验签失败");
}
//3. 解密
string plainData = null;
if (isDataEncrypted)
{
try
{
plainData = AlipayEncrypt.AesDencrypt(decryptKey, content, charset);
Console.WriteLine("AES解密结果:" + plainData);
}
catch (Exception ex)
{
//解密异常, 记录日志
throw new Exception("解密异常", ex);
}
}
else
{
plainData = content;
}
return plainData;
}