微信公众号网页开发(手摸手教程)

565 阅读5分钟

先列一下需要的基本参数,后边会有具体的介绍(开发代码在附录内)

    var config = 'http://192.168.20.21:8074'
    // 其他后台服务地址
    var otherConfig = 'http://192.168.20.21:8072'
    // 微信公众号的appid
    var appid = 'wxf9c06891de9d8b25'
    // 公众号页面获取微信授权后的跳转地址
    var redirect_uri = 'http%3A%2F%2Fdhz.mydeskmedia.com%2Fwebapp%2Fcdm%2FweChatOfficialAccount%2Findex.html'
    // 页面地址
    var url = 'http://dhz.mydeskmedia.com/webapp/cdm/weChatOfficialAccount/index.html'
    // 微信公众号的app密匙
    var appSecret = 'f763316a3bf97934641ab2d68555b7a6'
    // 通过微信公众号的接口获取到token
    var token = '',
      // 微信用户的openid
      openid = '',
      // 生成js-sdk签名的临时票据
      jsapi_ticket = '',
      // 签名
      signature = '',
      // 生成签名的时间戳
      signTimestamp = '',
      // 生成签名的uuid
      signNonceStr = ''

第一步:获取code

如下方的代码先检测url地址是否有code信息,如若没有则调用微信的申请授权页面:

https://open.weixin.qq.com/connect/oauth2/authorize

该页面为微信获取授权页面,后面需要添加参数进行访问,参数分别为(固定顺序添加):

appid,redirect_uri,repsponse_type,scope,state,#wechat_redirect,forcePopup(非必填)

例:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx807d86fb6b3d4fd2&redirect_uri=http%3A%2F%2Fdevelopers.weixin.qq.com&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

forcePopup:用于控制是否强制弹出授权页面。当 forcePopup 参数为 true 时,无论用户是否已经授权过,都会强制弹出授权页面,让用户重新进行授权;当 forcePopup 参数为 false 或者不传递该参数时,如果用户已经授权过,就直接获取用户的 openid,否则就返回错误信息。

微信访问改页面时如下图所示:

微信图片\_20230531165734.jpg 微信图片_20230601090637.jpg 点击允许过后微信页面会自动读取参数前往redirect\_uri(需要urlEncode转码)所指向的地址并在地址后拼接code参数,即重新进入页面读取到code

第二步:获取openid、access_token

token的获取和code不同,我们需要通过后台进行访问接口获取,前台页面无法访问改接口去进行token的获取(跨域)。需要后台进行访问。在下方的代码中通过 /wechatScanCode/getAccessToken 进行获取。

微信的接口为:

api.weixin.qq.com/sns/oauth2/…

该接口地址在后台调用可以获取到 openid 和 access_token ,其中 grant_type 配置项可以填写为 authorization_code 和 client_credential 。

authorization_code 和 client_credentiald 区别

在微信公众平台和小程序平台中,获取 access_token 时,grant_type 参数有两种取值:authorization_code 和 client_credential,分别对应不同的授权类型。

authorization_code 授权类型用于获取用户的 openid 和 access_token,通常用于网页授权流程中。在网页授权流程中,用户需要先授权给公众号或小程序,然后通过回调地址获取到一个授权码 code,最后使用授权码 code 换取用户的 openid 和 access_token。调用 api.weixin.qq.com/sns/oauth2/… 接口时,需要将 grant_type 参数设置为 authorization_code,同时需要提供 AppID、AppSecret 和 code 等参数,微信服务器会返回一个 access_token 和 openid,用于后续的接口调用。

client_credential 授权类型用于获取公众号或小程序的 access_token,通常用于服务器端接口调用。在服务器端接口调用中,不需要用户授权,只需要使用公众号或小程序的 AppID 和 AppSecret 进行授权即可。调用 api.weixin.qq.com/cgi-bin/tok… 接口时,需要将 grant_type 参数设置为 client_credential,同时需要提供 AppID 和 AppSecret 等参数,微信服务器会返回一个 access_token,用于后续的接口调用。

需要注意的是,authorization_code 和 client_credential 授权类型对应不同的接口和返回结果,需要根据实际情况选择合适的授权类型和接口。

client_credentiald 详细介绍

在获取 access_token 时,grant_type 参数的取值为 client_credential,表示使用客户端凭证(AppID 和 AppSecret)进行授权。调用 api.weixin.qq.com/cgi-bin/tok… 接口时,需要将 grant_type 参数设置为 client_credential,同时需要提供 AppID 和 AppSecret 等参数,微信服务器会返回一个 access_token,用于后续的接口调用。

在获取 jsapi_ticket 时,grant_type 参数的取值为 client_credential,表示使用客户端凭证(AppID 和 AppSecret)进行授权。调用 api.weixin.qq.com/cgi-bin/tic… 接口时,需要将 grant_type 参数设置为 client_credential,同时需要提供 AppID 和 AppSecret 等参数,微信服务器会返回一个 jsapi_ticket,用于后续的 JS-SDK 签名验证。

需要注意的是,grant_type 参数是必须的,不同的授权类型对应不同的 grant_type 参数取值。在调用接口时,需要根据实际情况设置 grant_type 参数,否则会返回错误信息。

第三步:获取js-sdk签名

通过前面的两步,我们已经获取了openid,code,access_token

拥有这三项参数后我们就可以进行公众号页面的开发了,如果需要用到微信的一些功能,比如微信扫一扫,分享,定位等等就需要使用到微信的 JS-SDK 。

引入:

res.wx.qq.com/open/js/jwe…

res2.wx.qq.com/open/js/jwe… (支持https)。

以上两个是JS-SDK的静态资源地址我们可以在 script 标签内进行访问,也可复制下来本地文件引入。

引用后我们需要测试一下接入,调用 wx.config 传递令牌等参数进行接入权限验证配置。

所需参数:

debug,appId,timestamp,nonceStr,signature,jsApiList

其中 signature 是签名需要算法生成,老规矩交给后端(前端也可以但是没必要),同时 signature 的生成算法是加入了 timestamp 和 nonceStr 的,所以交由后端一并生成后一起返回。

jsApiList 内填写你需要用到的wxApi,例如:jsApiList: ['scanQRCode']

debug 是调试参数会将wxApi的结果以alert的形式展示,参数是 true、false

第四步:开始开发

获取了token,code,以及签名之后我们就可以进行开发了,前三步的代码在下面展示。

另外说一些需要注意的点:

1,code值只能用一次,所以需要配置获取失败后返回重新访问页面地址而不是reload页面,因为reload的话页面上的url还是无效的code无法刷新。

2,redirect_uri 的地址需要转码,并且要在域名服务内进行配置域名要经过ICP备案。

3,访问微信接口时要将后台服务的外网 IP 配置到微信公众品台内的开发设置 IP 白名单内。

4,appid和app密匙等尽量放在后台内,统一向后台申请获取。

附录:申请授权和申请使用扫一扫api代码

    <script src="./js/jquery-3.2.1.min.js"></script>
    <script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
    <script>
        //获取url中code参数
        var code = GetURL('code');
        //获取地址栏参数
        function GetURL(name) {
          var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
          var r = window.location.search.substr(1).match(reg);
          if (r != null) return unescape(r[2]);
          return null;
        };
        //如果没有code,转跳到授权页进行授权
        if (!code) {
          window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appid + '&redirect_uri=' + redirect_uri + '&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
        } else if (code.length > 0) {
          getToken()
        }
        // 获取token
        function getToken() {
          $.ajax({
            url: config + "/wechatScanCode/getAccessToken?code=" + code,
            type: "get",
            dataType: "json",
            contentType: "application/json",
            success: function (data) {
              token = data.data.access_token
              openid = data.data.openid
              jsapi_ticket = data.data.jsapi_ticket
              signature = data.data.sign
              signTimestamp = data.data.timestamp
              signNonceStr = data.data.nonceStr
              wxInit()
              // 业务功能方法
              checkOpenidBinding()
            }
          })
        }
        // 初始化微信
        function wxInit() {
          wx.config({
            debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: appid, // 必填,公众号的唯一标识
            timestamp: signTimestamp, // 必填,生成签名的时间戳
            nonceStr: signNonceStr, // 必填,生成签名的随机串
            signature: signature, // 必填,签名
            jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表
          });
          wx.ready(function () {});
        }
    </script>