>  기사  >  위챗 애플릿  >  PHP는 WeChat SDK 공유 인터페이스를 구현합니다.

PHP는 WeChat SDK 공유 인터페이스를 구현합니다.

小云云
小云云원래의
2018-03-16 14:10:395743검색

소프트웨어 개발 키트(외국어 약어: SDK, 외국어 전체 이름: Software Development Kit)는 일반적으로 일부 소프트웨어 엔지니어가 특정 소프트웨어 패키지, 소프트웨어 프레임워크, 하드웨어 플랫폼, 운영 체제, 등. . 이 기사는 주로 PHP에서 WeChat SDK 공유 인터페이스를 구현하는 방법을 공유합니다. 도움이 되기를 바랍니다.

<?php
class Wxsdk
{
    private $appId;
    private $appSecret;

    /*
     * 这里为威狮码的公众号的openid和appsecret,如果配置到其他的子商家会出现需要关注威狮码公众号,
     * 则需要获取数据库的vender表里面的openid和appsecret
     * */
    public function __construct($appId = &#39;自己的appid&#39;, $appSecret = &#39;自己的appSecret&#39;)
    {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }


    public function getSignPackage(Request $request)
    {
//接收到前端的转义url转义回来
        $url = $_POST;
        $durl = $url[&#39;url&#39;];
        $durl = urldecode($durl);

        $jsapiTicket = $this->getJsApiTicket();
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$durl";


        $signature = sha1($string);


        $signPackage = [
            "appId" => $this->appId,
            "nonceStr" => $nonceStr,
            "timestamp" => $timestamp,
            "url" => $url,
            "signature" => $signature,
            "rawString" => $string
        ];
//        var_dump($signPackage);die;
        throw new SuccessMessage([&#39;msg&#39; => $signPackage]);
    }


    private 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;
    }


    private function getJsApiTicket()
    {
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode(file_get_contents("jssdk/jsapi_ticket.json"));
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            //定义传递的参数数组
            $params[&#39;type&#39;] = &#39;jsapi&#39;;
            $params[&#39;access_token&#39;] = $accessToken;
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $params[&#39;access_token&#39;] . "&type=" . $params[&#39;type&#39;] . "";
            $res = json_decode(curl_get($url, $params));
            $ticket = isset($res->ticket) ? $res->ticket : NULL;
            if ($ticket) {
                $res->expire_time = time() + 7000;
                $res->jsapi_ticket = $ticket;
                $fp = fopen("jssdk/jsapi_ticket.json", "w");
                fwrite($fp, json_encode($res));
                fclose($fp);
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }
        return $ticket;
    }


    private function getAccessToken()
    {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode(file_get_contents("jssdk/access_token.json"));
        if ($data->expire_time < time()) {
            //定义传递的参数数组
            $params[&#39;grant_type&#39;] = &#39;client_credential&#39;;
            $params[&#39;appid&#39;] = $this->appId;
            $params[&#39;secret&#39;] = $this->appSecret;
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" . $params[&#39;grant_type&#39;] . "&appid=" . $params[&#39;appid&#39;] . "&secret=" . $params[&#39;secret&#39;] . "";
            $res = json_decode(curl_post($url, $params));
            $access_token = isset($res->access_token) ? $res->access_token : NULL;
            if ($access_token) {
                $res->expire_time = time() + 7000;
                $res->access_token = $access_token;
                $fp = fopen("jssdk/access_token.json", "w");
                fwrite($fp, json_encode($res));
                fclose($fp);
            }
        } else {
            $access_token = $data->access_token;
        }
        return $access_token;
    }
前端代码

공식 단계를 확인하고 서명 알고리즘을 확인하세요.

  • 서명 알고리즘이 올바른지 확인하세요. http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 페이지 도구를 사용하여 확인할 수 있습니다.

  • 구성의 nonceStr(js의 표준 낙타 대문자 S) 및 타임스탬프가 서명에 사용된 해당 noncestr 및 타임스탬프와 일치하는지 확인하세요.

  • URL이 'http(s)://를 포함하여 페이지의 전체 URL인지 확인하세요(현재 페이지에서 확인하세요. Alert(location.href.split('#')[0])). ' 부분, 그리고 '? '' 뒤에 GET 매개변수 부분이 있지만, '#' 해시 다음 부분은 포함되지 않습니다.

  • 구성의 appid가 jsapi_ticket을 얻는 데 사용된 appid와 일치하는지 확인하세요.

  • access_token 및 jsapi_ticket을 캐시해야 합니다.

  • 서명을 위해 얻은 URL이 동적으로 얻어졌는지 확인하세요. 동적 페이지의 경우 예제 코드의 PHP 구현을 참조하세요. html의 정적 페이지인 경우 프런트 엔드에서 ajax를 통해 서명을 위해 URL이 백엔드로 전달됩니다. 프런트 엔드에서는 '#' 해시 부분을 제외하고 현재 페이지의 링크를 가져오기 위해 js를 사용해야 합니다. location.href.split('#')[0]에 의해 획득되며 encodeURIComponent, 백그라운드 decodeURIComponent 디코딩이 필요합니다. 페이지가 공유되면 WeChat 클라이언트는 현재 링크의 끝에 다른 매개변수를 추가하기 때문입니다. 동적으로 획득되지 않으면 공유 페이지의 서명이 실패합니다.

위 단계로 문제를 해결할 수 없는 경우(잘못된 서명), URL 문제를 사용하세요. 참고: WeChat 공식 계정은 디버그하는 보안 도메인 이름으로 구성되어야 합니다. -레벨 도메인 이름: 여러 a.xxx.com/b.xxx.com 등을 구성하는 대신 xxx.com).

이유: WeChat은 공유 시 현재 페이지에 여러 매개변수를 추가합니다. sha1에서는 URL 주소가 WeChat이 매개변수를 추가한 후의 주소인지 확인해야 구성: 잘못된 서명이 보고되지 않습니다.

해결 방법: sha1 이전에는 URL이 디코딩 후 육안으로 직접 인식할 수 있는 일반 URL이어야 합니다. 정적 페이지를 사용하는 경우 wx.config를 구성하기 전에 먼저 encodeURIComponent(location.href.split(')를 전달합니다. #')[0] ) decodeURIComponent로 디코딩된 현재 URL 인코딩을 백엔드에 전달합니다. 핵심 코드는 다음과 같습니다.

frontend html 페이지, URL 인코딩:

jQuery.post("/xxx", {"url": encodeURIComponent(window.location.href.split(&#39;#&#39;)[0]),"t": new Date().getTime()}, function (result) {
    if (result.errno != 0) {
        alert("您当前的网络不稳定请稍后再试!");
        return;
    }
    var shareUrl = result.data.url;
    wx.config({
        debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: &#39;xxx&#39;, // 必填,公众号的唯一标识
        timestamp: result.data.timestamp, // 必填,生成签名的时间戳
        nonceStr: result.data.nonceStr, // 必填,生成签名的随机串
        signature: result.data.signature,// 必填,签名,见附录1
        jsApiList: [&#39;onMenuShareAppMessage&#39;,&#39;onMenuShareTimeline&#39;,&#39;onMenuShareQQ&#39;,&#39;onMenuShareWeibo&#39;,&#39;onMenuShareQZone&#39;] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
    });


위 내용은 PHP는 WeChat SDK 공유 인터페이스를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.