简要描述:
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳 秒为单位、整数
nonceStr: '', // 必填,生成签名的随机串 16位大小写字母+数字
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
官网文档:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
签名验证:
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
jsApiList:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#63
接口版本:
版本号 | 制定人 | 制定日期 | 修订日期 |
---|---|---|---|
v3 | 陈碧贵 | 2021-08-28 | xxxx-xx-xx |
请求URL:
http://{url参数}/bs/api/v3/dev/wechat/config/{ownerId}/{state}
{state}为随机码,保存在cookie,作为后端接口缓存redis的key
请求方式:
- POST
请求头:
参数名 | 是否必须 | 类型 | 说明 |
---|---|---|---|
XownerId | 是 | string | 项目唯一ID,对应bo_project {ownerId} |
XsysId | 否 | string | 所属系统 对应 bo_system 表 |
XuserFromFirstShareId | string | 否 | 一级分享用户ID, bo_user user_id |
XuserFromSecondShareId | string | 否 | 二级分享用户ID, bo_user user_id |
XverifyApi | 是 | string | 加密规则encryptByDES(`${newGuid()} |
XfilterAreaCode | 否 | string | 行政区编码, 对应 bo_sys_area area_code |
Content-Type: | 是 | string | application/json; charset=utf-8 请求类型 |
请求参数(body):
{
"url":"https://bt.sandieji.tech?a=1&b=1"
}
参数名 | 是否必须 | 类型 | 说明 |
---|---|---|---|
verifyGuid | 是 | string | 36位的guid值 ,同时需要传递给登录接口 |
ownerId | 是 | string | 所属项目 |
_nodejs | 是 | string | common-data 对应/Config/AppNodeJs/Plugins/fn- common-data.js, 通过nodejs插件,对响应结果进行二次处理 common-data 普通数据(小写驼峰)common-data-under 普通数据下划线 |
path参数名 | 是否必须 | 类型 | 说明 |
---|---|---|---|
state | 是 | string | 随机状态码 |
返回示例:
正确时返回:
{
"data": {
"debug": true,
"appId": "wx8e173677a48c",
"timestamp": "1630158811",
"nonceStr": "fd43d24cfa5f42d5",
"signature": "44a89f7ad11e10d68f6de401c1ffc3135c93",
"accessToken": "48_QScfw28RW2sUtcdS7AlmRZvMd27cP0o30RKRxIyZ8jV9Kxm7kKktNOy0j5bApAzOUEOVRUsdneUXO9F3S2AZcp4y0nhYDTL8eNWN9Z4McIdnIk-SKT6azjPIgABUtvmO0trn30yj7g385eEVUXOgAHAXAR",
"ticket": "kgt8ON7yVITDhtdwci0qeemJ_IEoEGXOW99AFoUHjM4o4GUNvMyuUE2IBKOUl7ZhNWIvaBZvKp9CYJgBbog5iw",
"signatureStr": "jsapi_ticket=kgt8ON7yVITDhtdwci0qeemJ_IEoEGXOW99AFoUHjM4o4GUNvMyuUE2IBKOUl7ZhNWIvaBZvKp9CYJgBbog5iw&noncestr=fd43d24cfa5f42d5×tamp=1630158811&url=https://bt.sandieji.tech"
},
"code": "0",
"retCode": "0",
"success": true
}
备注:accessToken、ticket、debug、signatureStr 开发时候生效,生产环境忽略输出
错误时返回:
{
"code": 0,
"message": ""
"error":{
errorCode:null,
errorText:null
}
"success": false,
}
后端代码实现 RG3.BS.Dev.WeChatService$WxConfig.cs:
/// <summary>
/// 微信配置文件获取
/// </summary>
/// <param name="ownerId"></param>
/// <param name="sysId"></param>
/// <param name="state"></param>
/// <param name="url">分享的url地址</param>
/// <returns></returns>
public async Task<ResultDetail<WeChatConfig>> GetWeChatConfigByWeChatAsync(string ownerId, string sysId, string state, string url)
{
_configDev = _configurationBuilderService.GetConfigurationDevProvider(ownerId, sysId, null, _accessor, "tencent");
string _fromSource = "ticket";
string _appId = _configDev.GetValue<string>($"dev:tencent:{_fromSource}:{ownerId}{sysId}:appId");
if (string.IsNullOrEmpty(_appId))
{
_appId = _configDev.GetValue<string>($"dev:tencent:{_fromSource}:{ownerId}:appId");
}
// noncestr = Wm3WZYTPz0wzccnW
//jsapi_ticket = sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3 - Sl - HhTdfl2fzFy1AOcHKP7qg
//timestamp = 1414587457
//url = http://mp.weixin.qq.com?params=value
var accessToken = GetAccessTokenByWeChatAsync(ownerId, sysId, state);
var timeStamp = DateTimeUtil.ToTimestamp(DateTime.Now.AddSeconds(120));
//避免带有特殊字符,导致微信认证不通过,且长度为16
var nonceStr = String.Join("",Guid.NewGuid().ToString().Split('-')).Substring(0,16);
string[] array = { $"jsapi_ticket={accessToken}", $"timestamp={timeStamp}", $"noncestr={nonceStr}", $"url={url}" };
//进行排序
Array.Sort(array);
//拼接为一个字符串
string tempStr = String.Join("", array);
//对字符串进行 SHA1加密
string signature = GetSHA1(tempStr);
var config = new WeChatConfig
{
Debug = !EnvPFUtil.IsProduction(),
Timestamp = timeStamp.ToString(),
NonceStr = nonceStr,
Signature = signature,
AppId = _appId
};
return await Task.FromResult<ResultDetail<WeChatConfig>>(new ResultDetail<WeChatConfig> { Success = true, Data = config });
}
post请求授权禁用
,
"wxconfig": {
"name": "微信config",
"path": "/bs/api/v3/dev/wechat/config",
"auth": null
}
.netcoreSHA1签名
/// <summary>
/// /* 使用BitConverter生成签名*/ 微信使用
/// </summary>
/// <param name="strSource"></param>
/// <returns></returns>
public static string GetWxSHA1(string strSource)
{
SHA1 sha = SHA1.Create();
byte[] bytResult = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource));
return BitConverter.ToString(bytResult).Replace("-", "");
}
/// <summary>
/// 进行 sha1 加密
/// 因为,signature是经过SHA1加密的,所以我们也要,进行一些SHA1加密才可以进行比较
/// </summary>
/// <param name="strSource"></param>
/// <returns></returns>
private string GetSHA1(string strSource)
{
string strResult = "";
//Create
System.Security.Cryptography.SHA1 md5 = System.Security.Cryptography.SHA1.Create();
//注意编码UTF8、UTF7、Unicode等的选择
byte[] bytResult = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource));
//字节类型的数组转换为字符串
for (int i = 0; i < bytResult.Length; i++)
{
//16进制转换
strResult = strResult + bytResult[i].ToString("X");
}
return strResult.ToLower();
}
文档更新时间: 2021-08-30 08:00 作者:admin