15年软件开发经验 只做源码定制 互联网+定制化解决方案

15年软件开发经验,只做源码定制!

原创设计 定制开发

满足您的个性化需求

当前位置:首页 后端开发 Thinkphp5

微信分享JSSDK 开发+tp5

| 发布于 2023-03-23 15:37:42| 217阅读| 0点赞| 0评论
举报

wx.ready在你wx.config验证成功后无论验证失败或者成功都会执行的, 那如何区别你的项目是否成功了呢,加上wx.error 在wx.ready和wx.error都打印下看看哪个会先执行,error先执行的那就是验证失败了,就是后台代码的毛病 用微信中新的接口就行,即将废弃的就不要用了吧省得以后维护也麻烦。

关于微信jssdk的使用一般遇到问题都是第一时间去查官方文档,但是官方文档也只是告诉你基本的步骤剩下的还是需要你去查资料或者问度娘。这篇文章主要说下微信公众号的分享功能.

 先看看官方文档中给的提示吧。这五条步骤是没错的

步骤一:绑定域名

步骤二:引入js接口

步骤三:通过config接口注入权限验证配置

步骤四:通过ready接口处理成功验证

步骤五:通过error接口处理失败验证

步骤一和步骤二看文档相信大家都能看懂,到步骤三问题来了这些数据从哪来话不多说直接上代码


 public function get_sign(){

        // 微信 js 接口签名校验工具: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

        $appid = 'wx*************19d2d';

        $secret = '66d**************4d4a9cf848';

        // 获取token

        $token_data = file_get_contents(__DIR__.'\wechat_token.txt');

        $time = 7200;

        if (!empty($token_data)) {

            $token_data = json_decode($token_data, true);

            $time  = time() - $token_data['time'];

        }

        if ($time > 3600) {

            $token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";

            $token_res = $this->https_request($token_url);

            $token_res = json_decode($token_res, true);

            $token = $token_res['access_token'];

            $data = array(

                'time' =>time(),

                'token' =>$token

            );

 

            $res = file_put_contents(__DIR__.'\wechat_token.txt', json_encode($data));

            if ($res) {

                echo '更新 token 成功';

            }

        } else {

            $token = $token_data['token'];

        }

        // 获取ticket

        $ticket_data = file_get_contents(__DIR__.'\wechat_ticket.txt');

        $time1 = 7200;

        if (!empty($ticket_data)) {

            $ticket_data = json_decode($ticket_data, true);

            $time1  = time() - $ticket_data['time'];

        }

        if ($time1 > 3600) {

            $ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$token}&type=jsapi";

            $ticket_res = $this->https_request($ticket_url);

            $ticket_res = json_decode($ticket_res, true);

            $ticket = $ticket_res['ticket'];

            $data = array(

                'time'    =>time(),

                'ticket'  =>$ticket

            );

            $res = file_put_contents(__DIR__.'\wechat_ticket.txt', json_encode($data));

            if ($res) {

                echo '更新 ticket 成功';

            }

        } else {

            $ticket = $ticket_data['ticket'];

        }

        // 进行sha1签名

        $timestamp = time();

        $nonceStr = $this->createNonceStr();

        // 注意 URL 建议动态获取(也可以写死).

        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";

        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; // 调用jsSDK的页面地址

        //$url = $_SERVER['HTTP_REFERER']; // 前后端分离的, 获取请求地址(此值不准确时可以通过其他方式解决)

        $str = "jsapi_ticket={$ticket}&noncestr={$nonceStr}×tamp={$timestamp}&url={$url}";

        $sha_str = sha1($str);

        $signPackage = array(

            "appId" =>  $appid,

            "nonceStr" => $nonceStr,

            "timestamp" => $timestamp,

            "signature" => $sha_str,

        );

        return $signPackage;

    }

    //随机字符串

    public function createNonceStr($length = 16) {

        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        $str = "";

        for ($i = 0; $i < $length; $i++) {

            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);

        }

        return $str;

    }

    // 模拟 http 请求

    public function https_request($url, $data = null){

        // curl 初始化

        $curl = curl_init();

        // curl 设置

        curl_setopt($curl, CURLOPT_URL, $url);

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

        // 判断 $data get  or post

        if ( !empty($data) ) {

            curl_setopt($curl, CURLOPT_POST, 1);

            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

        }

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        // 执行

        $res = curl_exec($curl);

        curl_close($curl);

        return $res;

    }
注意换上自己的项目参数,在你需要用到参数的方法中这样写就能用啦(如下)


data=array();

      $wx_config =$this->get_sign();

       $data=array_merge($data,$wx_config);

   

       $this->assign('data',$data);

前端部分的代码我也附上吧,谁叫我这么好心呢。哪个页面用就放到那个页面里面



有的同事到这可能会遇到些问题,放心我会出手。
wx.ready在你wx.config验证成功后无论验证失败或者成功都会执行的,
那如何区别你的项目是否成功了呢,加上wx.error
在wx.ready和wx.error都打印下看看哪个会先执行,error先执行的那就是验证失败了,就是后台代码的毛病
用微信中新的接口就行,即将废弃的就不要用了吧省得以后维护也麻烦。


享出去的链接需要注意下
微信开放全域名访问后出现的限制。目前可从 公众号菜单进入分享、扫描二维码后分享、添加到收藏,
从微信我的收藏进入分享 是正常的。其他地方进入分享都是链接
链接中的参数自己在方法中设置就行根据客户需求来设置


0

0条评论

别默默看啦~登录/注册一起参与讨论吧~

热门标签

微信扫一扫立即咨询
账号登录|扫码登录

立即注册 |忘记密码?

欢迎注册

已有账号马上登录

重置密码

扫码绑定微信
微信扫一扫

绑定手机号

分享到-微信

举报

  • 举报类型:

  • 举报描述:

您好,当前积分不足。

在线客服
拨打电话
17330196230 13230981129
顶部