杨吉山 發表於 2024-8-2 11:17:00

uni-app h5 使用微信JSSDK的方式

<p>综合各方经验及文档总结了以下我的使用方法,希望对有需要的同学有些帮助<br>第一步:npm install jweixin-module --save<br>第二步:common文件夹新建js文件,我这里命名jwx.js</p>
<p><img src="https://img2024.cnblogs.com/blog/590646/202408/590646-20240802111435282-2025485911.png"></p>
<p>&nbsp;jwx.js 文件内容</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> jWeixin = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">jweixin-module</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断是否在微信中    </span>
<span style="color: rgba(0, 0, 0, 1)">    isWechat: function() {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> ua =<span style="color: rgba(0, 0, 0, 1)"> window.navigator.userAgent.toLowerCase();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (ua.match(/micromessenger/i) == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">micromessenger</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) {
            console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">是微信客户端</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">不是微信客户端</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    },
    initJssdk:function(callback){
         </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> var uri = encodeURIComponent(window.location.href);</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> uri = encodeURIComponent(window.location.href.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">#</span><span style="color: rgba(128, 0, 0, 1)">'</span>)[<span style="color: rgba(128, 0, 128, 1)">0</span>]);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取当前url然后传递给后台获取授权和签名信息</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> url = `/proxyapi/api/account/<span style="color: rgba(0, 0, 0, 1)">wxshare`
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> token = uni.getStorageSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> headers =<span style="color: rgba(0, 0, 0, 1)"> {}
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (token &amp;&amp; token !== <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">undefined</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) {
            headers[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">token</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> token
      }
      uni.request({
            url:url,</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">你的接口地址</span>
<span style="color: rgba(0, 0, 0, 1)">            header: headers,
            data:{
                url:uri
            },
            success:(re)</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
                console.log(re)
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> res =<span style="color: rgba(0, 0, 0, 1)"> re.data
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回需要的参数appId,timestamp,noncestr,signature等
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注入config权限配置</span>
<span style="color: rgba(0, 0, 0, 1)">                jWeixin.config({
                  debug: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
                  appId: res.data.appId,
                  timestamp: res.data.timestamp,
                  nonceStr: res.data.nonceStr,
                  signature: res.data.signature,
                  jsApiList: res.data.jsApiList
                });
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (callback) {
                  callback(res.data);
                }

            }
      })
    },
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在需要定位页面调用</span>
<span style="color: rgba(0, 0, 0, 1)">    getlocation: function(callback) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.isWechat()) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">console.log('不是微信客户端')</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initJssdk(function(res) {
            jWeixin.ready(function() {
                jWeixin.getLocation({
                  type: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gcj02</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'</span>
<span style="color: rgba(0, 0, 0, 1)">                  success: function (res) {
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(res);</span>
<span style="color: rgba(0, 0, 0, 1)">                        callback(res)
                  },
                  fail:function(res){
                        console.log(res)
                  },
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> complete:function(res){
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   console.log(res)
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> }</span>
<span style="color: rgba(0, 0, 0, 1)">                });
            });
      });
    },
    openlocation:function(data,callback){</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打开位置</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.isWechat()) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">console.log('不是微信客户端')</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initJssdk(function(res) {
            jWeixin.ready(function() {
                jWeixin.openLocation({</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据传入的坐标打开地图</span>
<span style="color: rgba(0, 0, 0, 1)">                  latitude:data.latitude,
                  longitude:data.longitude
                });
            });
      });
    },
    chooseImage:function(callback){</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">选择图片</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.isWechat()) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">console.log('不是微信客户端')</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">console.log(data);</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initJssdk(function(res) {
            jWeixin.ready(function() {
                jWeixin.chooseImage({
                  count:</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">,
                  sizeType:[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">compressed</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">],
                  sourceType:[</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">album</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">],
                  success:function(rs){
                        callback(rs)
                  }
                })
            });
      });
    },
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">微信支付</span>
<span style="color: rgba(0, 0, 0, 1)">    wxpay: function(data,callback) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.isWechat()) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">console.log('不是微信客户端')</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initJssdk(function(res) {
            jWeixin.ready(function() {
                jWeixin.chooseWXPay({
                  timestamp: data.timestamp, </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符</span>
                  nonceStr: data.nonceStr, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 支付签名随机串,不长于 32 位</span>
                  package: data.package, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)</span>
                  signType: data.signType, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 签名方式,默认为'SHA1',使用新版支付需传入'MD5'</span>
                  paySign: data.paysign, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 支付签名</span>
<span style="color: rgba(0, 0, 0, 1)">                  success: function (res) {
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(res);</span>
<span style="color: rgba(0, 0, 0, 1)">                        callback(res)
                  },
                  fail:function(res){
                        callback(res)
                  },
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> complete:function(res){
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   console.log(res)
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> }</span>
<span style="color: rgba(0, 0, 0, 1)">                });
            });
      });
    }
}</span></pre>
</div>
<p>第三步:main.js 文件里引入<br>import jwx from '@/common/jwx'<br>Vue.prototype.$jwx = jwx</p>
<p>第四步:在需要的页面直接用this.$jwx.xxx(接口名称)调用即可</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.$jwx &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span>.$jwx.isWechat()) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检查是否是微信环境</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.$jwx.getlocation(function (res) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取位置</span>
<span style="color: rgba(0, 0, 0, 1)">      console.log(res);
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拿到返回数据自行处理</span>
<span style="color: rgba(0, 0, 0, 1)">      });

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用支付前应先处理订单信息,然后根据订单信息返回支付需要的timestamp,noncestr,package,signType,paySign等参数
   </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">下面的rs.data为后台处理完订单后返回的;我的业务模式为用户点击提交订单,请求后台添加订单接口,订单添加完成后,后台根据订单id,订单金额等信息调用微信签名拿到timestamp,noncestr等参数返回;</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.$jwx.wxpay({<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用支付,</span>
      <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:rs.data.timeStamp,   
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">nonceStr</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:rs.data.nonceStr,
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">package</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:rs.data.package,
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">signType</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:rs.data.signType,
      </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">paysign</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:rs.data.paySign
    },function (r) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (r.errMsg == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">chooseWXPay:ok</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) {
            uni.redirectTo({</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">支付成功转到支付成功提示页面</span>
                url: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/pages/paySuccess</span>
<span style="color: rgba(0, 0, 0, 1)">            })
      }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
            that.$msg(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">支付失败!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    });
}</span></pre>
</div>
<p>&nbsp;原地址:https://ask.dcloud.net.cn/article/id-36813</p>
<p>&nbsp;</p>
<p>fastadmin后台:Wxjssdk.php</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> app\common\library;

use fast\Random;
use FilesystemIterator;
use think\Config;
use think\File;
use think\Hook;
use think\Cache;
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* @auther: xxf
* Date: 2019/11/8
* Time: 15:59
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Wxjssdk {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> $appId;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> $appSecret;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> function __construct($appId, $appSecret) {
      $</span><span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;appId =<span style="color: rgba(0, 0, 0, 1)"> $appId;
      $</span><span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;appSecret =<span style="color: rgba(0, 0, 0, 1)"> $appSecret;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> function getSignPackage($url) {
      $jsapiTicket </span>= $<span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">getJsApiTicket();
      $timestamp </span>=<span style="color: rgba(0, 0, 0, 1)"> time();
      $nonceStr </span>= $<span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">createNonceStr();
      $</span><span style="color: rgba(0, 0, 255, 1)">string</span> = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">jsapi_ticket=$jsapiTicket&amp;noncestr=$nonceStr&amp;timestamp=$timestamp&amp;url=$url</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

      $signature </span>= sha1($<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);

      $signPackage </span>=<span style="color: rgba(0, 0, 0, 1)"> array(
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">appId</span><span style="color: rgba(128, 0, 0, 1)">"</span>   =&gt; $<span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">appId,
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nonceStr</span><span style="color: rgba(128, 0, 0, 1)">"</span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> $nonceStr,
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">"</span> =&gt;<span style="color: rgba(0, 0, 0, 1)"> $timestamp,
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">url</span><span style="color: rgba(128, 0, 0, 1)">"</span>       =&gt;<span style="color: rgba(0, 0, 0, 1)"> $url,
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">signature</span><span style="color: rgba(128, 0, 0, 1)">"</span> =&gt;<span style="color: rgba(0, 0, 0, 1)"> $signature,
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rawString</span><span style="color: rgba(128, 0, 0, 1)">"</span> =&gt; $<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">
      );
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> $signPackage;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> function createNonceStr($length = <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">) {
      $chars </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
      $str </span>= <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> ($i = <span style="color: rgba(128, 0, 128, 1)">0</span>; $i &lt; $length; $i++<span style="color: rgba(0, 0, 0, 1)">) {
            $str .</span>= substr($chars, mt_rand(<span style="color: rgba(128, 0, 128, 1)">0</span>, strlen($chars) - <span style="color: rgba(128, 0, 128, 1)">1</span>), <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> $str;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> function getJsApiTicket() {
      $ticket </span>= Cache::<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">jsapi_ticket</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">$ticket) {
            $accessToken </span>= $<span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">getAccessToken();
            $url </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&amp;access_token=$accessToken</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            $res </span>= json_decode($<span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">httpGet($url));
            $ticket </span>= $res-&gt;<span style="color: rgba(0, 0, 0, 1)">ticket;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> ($ticket) {
                Cache::</span><span style="color: rgba(0, 0, 255, 1)">set</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">jsapi_ticket</span><span style="color: rgba(128, 0, 0, 1)">'</span>,$ticket,<span style="color: rgba(128, 0, 128, 1)">3600</span><span style="color: rgba(0, 0, 0, 1)">);
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> $data = new stdClass();
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> $data-&gt;expire_time = time() + 4000;
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> $data-&gt;jsapi_ticket = $ticket;
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> file_put_contents($file, json_encode($data));</span>
<span style="color: rgba(0, 0, 0, 1)">            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> $ticket;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> function getAccessToken() {
      $access_token </span>= Cache::<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">access_token</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">$access_token) {
            $url </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid=$this-&gt;appId&amp;secret=$this-&gt;appSecret</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            $res </span>= json_decode($<span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">httpGet($url));
            $access_token </span>= $res-&gt;<span style="color: rgba(0, 0, 0, 1)">access_token;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> ($access_token) {
                Cache::</span><span style="color: rgba(0, 0, 255, 1)">set</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">jsapi_ticket</span><span style="color: rgba(128, 0, 0, 1)">'</span>,$access_token,<span style="color: rgba(128, 0, 128, 1)">3600</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> $access_token;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> function httpGet($url) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> file_get_contents($url);
    }
}</span></pre>
</div>
<p>调用:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> function wxjssdk(){
      $jssdk </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Wxjssdk(APPID, AppSecret);
      $url </span>= $<span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;request-&gt;param(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">url</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      $url </span>=<span style="color: rgba(0, 0, 0, 1)"> urldecode($url);
      $url_arr </span>= explode(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">#</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,$url);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> dump($url_arr);</span>
      $url = $url_arr[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];</span>
      $signPackage = $jssdk-&gt;<span style="color: rgba(0, 0, 0, 1)">getSignPackage($url);
      $config </span>=<span style="color: rgba(0, 0, 0, 1)">array(
            </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">debug</span><span style="color: rgba(128, 0, 0, 1)">'</span> =&gt; <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appId</span><span style="color: rgba(128, 0, 0, 1)">'</span> =&gt; $signPackage[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">appId</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">],
            </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">'</span> =&gt; $signPackage[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">],
            </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">nonceStr</span><span style="color: rgba(128, 0, 0, 1)">'</span> =&gt; $signPackage[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">nonceStr</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">],
            </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">signature</span><span style="color: rgba(128, 0, 0, 1)">'</span> =&gt; $signPackage[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">signature</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">],
            </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">jsApiList</span><span style="color: rgba(128, 0, 0, 1)">'</span> =&gt;<span style="color: rgba(0, 0, 0, 1)"> array(
                </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hideAllNonBaseMenuItem</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hideMenuItems</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
            )
      );
      $</span><span style="color: rgba(0, 0, 255, 1)">this</span>-&gt;success(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">验证成功</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,$config);
    }</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/zhangzhijian/p/18338360
頁: [1]
查看完整版本: uni-app h5 使用微信JSSDK的方式