Heim  >  Artikel  >  WeChat-Applet  >  PHP implementiert die WeChat SDK-Freigabeschnittstelle

PHP implementiert die WeChat SDK-Freigabeschnittstelle

小云云
小云云Original
2018-03-16 14:10:395743Durchsuche

Software Development Kit (fremdsprachige Abkürzung: SDK, fremdsprachiger vollständiger Name: Software Development Kit) ist im Allgemeinen ein Entwicklungstool, das von einigen Softwareentwicklern verwendet wird, um Anwendungssoftware für bestimmte Softwarepakete, Software-Frameworks, Hardwareplattformen, Betriebssysteme zu erstellen. usw. Sammlung. In diesem Artikel erfahren Sie hauptsächlich, wie Sie die WeChat SDK-Freigabeschnittstelle in PHP implementieren. Ich hoffe, er kann Ihnen helfen.

<?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;
    }
前端代码

Überprüfen Sie die offiziellen Schritte und bestätigen Sie den Signaturalgorithmus.

  • Bestätigen Sie, dass der Signaturalgorithmus korrekt ist. Sie können dafür das http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign-Seitentool verwenden Überprüfung.

  • Bestätigen Sie, dass der NonceStr (Standard-Großbuchstabe S in Camel Case in JS) und der Zeitstempel in der Konfiguration mit dem entsprechenden Noncestr und Zeitstempel in der Signatur übereinstimmen.

  • Bestätigen Sie, dass es sich bei der URL um die vollständige URL der Seite handelt (bitte bestätigen Sie dies in der aktuellen Seitenwarnung (location.href.split('#')[0]), einschließlich „http (s): //' Teil und '? 'Der GET-Parameterteil nach ', enthält jedoch nicht den Teil nach dem '#'-Hash.

  • Bestätigen Sie, dass die App-ID in der Konfiguration mit der App-ID übereinstimmt, die zum Abrufen von jsapi_ticket verwendet wurde.

  • Stellen Sie sicher, dass Sie access_token und jsapi_ticket zwischenspeichern.

  • Stellen Sie sicher, dass die URL, die Sie zum Signieren erhalten, dynamisch bezogen wird. Für dynamische Seiten beachten Sie bitte die PHP-Implementierung im Beispielcode. Wenn es sich um eine statische HTML-Seite handelt, wird die URL zur Signatur über Ajax am Frontend übergeben. Das Frontend muss js verwenden, um den Link der aktuellen Seite abzurufen, mit Ausnahme des Hash-Teils „#“. erhalten durch location.href.split('#')[0] und benötigen encodeURIComponent, HintergrunddecodeURIComponent-Dekodierung), da der WeChat-Client am Ende Ihres Links weitere Parameter hinzufügt, sobald die Seite freigegeben ist nicht dynamisch abgerufen wird, schlägt die Signatur der freigegebenen Seite fehl.

Die Signatur ist korrekt. Wenn die oben genannten Schritte Ihr Problem nicht lösen können (ungültige Signatur), verwenden Sie das URL-Problem. Hinweis: Das offizielle WeChat-Konto muss mit Ihrer Debugging-Sicherheitsdomäne konfiguriert sein Namen (Sie können den Domänennamen der zweiten Ebene konfigurieren: xxx.com, anstatt mehrere a.xxx.com/b.xxx.com usw. zu konfigurieren).

Grund: WeChat fügt beim Teilen mehrere Parameter zu Ihrer aktuellen Seite hinzu. Wenn Sie sha1, müssen Sie sicherstellen, dass die URL-Adresse die Adresse ist, nachdem WeChat Parameter zu Ihnen hinzugefügt hat, damit config: invalid nicht gemeldet wird Signatur.

Lösung: Die URL vor sha1 muss eine normale URL sein, die nach der Dekodierung direkt mit bloßem Auge erkannt werden kann, bevor Sie wx.config konfigurieren, übergeben Sie zunächst encodeURIComponent( location.href.split ('#')[0]) übergibt die aktuelle URL-Kodierung an das Backend, die von decodeURIComponent dekodiert wird. Der Kerncode lautet wie folgt:

Frontend-HTML-Seite, Kodierung der 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
    });


Das obige ist der detaillierte Inhalt vonPHP implementiert die WeChat SDK-Freigabeschnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn