微信JSSDK实现微信分享

前两天是试了试微信分享,看看文档感觉挺简单的一个东西,但是写写的时候 费了好大的劲。

 

11096212-df670e00172160a7.jpeg

大概效果是这样的

首先查看文档,按照里面的要求引入JS文件并且通过config接口注入权限验证配置

11096212-70a403c259ee5f3b.png


这里其他都还好一般出问题的都是这个signature。查看文档获取signature之前需要有access_token和jsapi_ticket。前者用于获取jsapi_ticket,而jsapi_ticket用于加密生成signature。

11096212-9157592ae98d6ad8.png


这里我踩到的坑是其中的url,我的网址是http://wx.zhaobo1.cn/jsshare。我很理所当然的使用这个网址作为url的值去生成signature。然后就是一直报invalid signature。然后突然想到会不会是网址的关系(因为看到了下面的网址和我的不一样)。多了一个form,然后试着那原来的url替换掉,然后就一点事情都没有了。

11096212-00f6cd0fd8de59e9.jpeg

 

哦哦哦,,对了还有还有如果是订阅号使用测试号的话还有一个小坑。域名和网址的区别。域名不需要加上http://或者https://。- -虽然道理我也懂,但是做的时候,我是真的有点傻傻的分不清。

 

11096212-56ff82354866ee5e.png

 

下面是用laravel实现的代码,可以参考

    /**
     * 获取access_token
     * @return mixed
     */
    function getAccessToken(){
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . config('params.WXAPPID') . '&secret=' . config('params.WXAPPSCERET');
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($ch);
        curl_close($ch);
        return json_decode($res,FALSE);
    }

    /**
     * 获取jsapi_ticket
     * @param $access_token
     * @return mixed
     */
    function getJsapiTicket($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $access_token .'&type=jsapi';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($ch);
        curl_close($ch);
        return json_decode($res,FALSE);
    }

    /**
     * 微信jssdk分享
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
     public function jsShare(Request $request){
        //获取accesstoken
        $access_token = $request->session()->get('access_token','');
        if (!$access_token){
            $access_token = $this->getAccessToken()->access_token;
            $request->session()->put('access_token',$access_token);
        }

        //获取jsapi_ticket
        $jsapi_ticket = $request->session()->get('jsapi_ticket','');
        if (!$jsapi_ticket){
            $jsapi_ticket = $this->getJsapiTicket($access_token)->ticket;
            $request->session()->put('jsapi_ticket',$jsapi_ticket);
        }

        $arr = [
            'appid' => config('params.WXAPPID'),
            'timestamp' => (string) time(),
            'noncestr' => str_random(16),
        ];
        $arrTmp = [
            'jsapi_ticket'=>$jsapi_ticket,
            'noncestr'=>$arr['noncestr'],
            'timestamp'=>$arr['timestamp'],
            'url'=>$request->getUri()
        ];
        $tmp = '';
        foreach ( $arrTmp as $k => $v){
            $tmp .= $k . '=' . $v . '&';
        }
        $tmp = substr($tmp,0,strlen($tmp)-1);
        $arr['signature'] = sha1($tmp);
        return view('wx.jsshare',$arr);
    }

这里我把access_token和jsapi_ticket写在session里面了。也可以写到地方去的。您开心就好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

the ache

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值