简要描述:

所有需要使用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&timestamp=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