PHP实现微信分享接口

PHP实现微信分享接口

最近公司做了一个页面,要微信分享,然后记录回执信息。看了看微信的开放文档,Bing了一下相关文章,发现大家贴的代码都大致类似,也没有什么技术难度,撰写此文为了记录一下内容,如能帮助到别人,则不胜荣幸。
框架:Laravel 5.5

前端代码

首先引入JS文件

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>

//注入配置信息
//配置信息$signPackage的生成逻辑在服务器端,安全原因。
wx.config({
    appId: "{{ $signPackage['appId'] }}",
    timestamp: "{{ $signPackage['timestamp'] }}",
    nonceStr: "{{ $signPackage['nonceStr'] }}",
    signature: "{{ $signPackage['signature'] }}",
    jsApiList: [
        "updateAppMessageShareData",
        "updateTimelineShareData"
        // 所有要调用的 API 都要加到这个列表中
    ]
});

PHP代码

微信开放文档JS-SDK说明文档:这是一个链接

依照文档解释,生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket (复制来的)。

首先使用appID和appSecret获取到access_token,写入缓存处理

    /*
     * 使用appID和appSecret,请求接口获取到access_token
     * return String $access_token
     */
    private function getAccessToken() {
        $data = Redis::get("wx_access_token");
        if ($data) {
            $access_token = $data->access_token;
        } else {
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;

            if ($access_token) {
                Redis::setEx("wx_access_token", 7100, $access_token);
            }
        }
        return $access_token;
    }

使用access_token再次请求,获取到jsapi_ticket。

    /*
     * 使用access_token,请求接口获取到jsapi_ticket
     * return String $ticket
     */
    private function getJsApiTicket() {
        $data = Redis::get("wx_jsapi_ticket");

        if ($data) {
            $ticket = $data;
        } else {
            //这里是先调用获取access_token的方法
            $accessToken = $this->getAccessToken();

            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;

            if ($ticket) {
                Redis::setEx("wx_jsapi_ticket", 7100, $ticket);
            }
        }

        return $ticket;
    }

最后生成签名,签名算法在微信开放文档里已经写的很详细了。

签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。即signature=sha1(string1)。

注意事项
1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
2.签名用的url必须是调用JS接口页面的完整URL。
3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。

具体代码我就不贴了,建议大家不要只是简单的粘贴复制,哪怕照着手敲上去,也比复制强,帮助理解。

PS:稍微有些注意的地方,文档内有提示,有些接口即将启用,请大家尽快迁移使用新的接口。

请注意,原有的 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,即将废弃。请尽快迁移使用客户端6.7.2及JSSDK 1.4.0以上版本支持的 wx.updateAppMessageShareData、wx.updateTimelineShareData接口。

本文内代码是我从其他道友发布的文章里摘下改造的,如有版权问题,请联系我,我会备注转载来源。在此之前,我将标注为原创 。谢谢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章