Maison  >  Article  >  Applet WeChat  >  PHP implémente l'interface de partage du SDK WeChat

PHP implémente l'interface de partage du SDK WeChat

小云云
小云云original
2018-03-16 14:10:395791parcourir

Le kit de développement logiciel (abréviation en langue étrangère : SDK, nom complet en langue étrangère : Kit de développement logiciel) est généralement un outil de développement utilisé par certains ingénieurs logiciels pour créer des logiciels d'application pour des progiciels, des cadres logiciels, des plates-formes matérielles, des systèmes d'exploitation spécifiques, etc. Cet article explique principalement comment implémenter l'interface de partage du SDK WeChat en PHP. J'espère qu'il pourra vous aider.

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

Vérifiez les étapes officielles et confirmez l'algorithme de signature.

  • Confirmez que l'algorithme de signature est correct, vous pouvez utiliser l'outil de page http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign pour vérification.

  • Confirmez que le nonceStr (S majuscule standard en cas de chameau en js) et l'horodatage dans la configuration sont cohérents avec le noncestr et l'horodatage correspondants utilisés dans la signature.

  • Confirmez que l'url est l'url complète de la page (veuillez confirmer sur l'alerte de la page actuelle (location.href.split('#')[0])), y compris ' http(s) : //'partie et '? 'La partie du paramètre GET après', mais n'inclut pas la partie après le hachage '#'.

  • Confirmez que l'appid dans la configuration est cohérent avec l'appid utilisé pour obtenir jsapi_ticket.

  • Assurez-vous de mettre en cache access_token et jsapi_ticket.

  • Assurez-vous que l'URL que vous obtenez pour la signature est obtenue dynamiquement. Pour les pages dynamiques, veuillez vous référer à l'implémentation PHP dans l'exemple de code. S'il s'agit d'une page HTML statique, l'URL est transmise au backend pour signature via ajax sur le front-end. Le front-end doit utiliser js pour obtenir le lien de la page actuelle, à l'exception de la partie de hachage '#' (peut être obtenu par location.href.split('#')[0], et nécessite encodeURIComponent, décodage en arrière-plan decodeURIComponent), car une fois la page partagée, le client WeChat ajoutera d'autres paramètres à la fin de votre lien si le lien actuel. n'est pas obtenu dynamiquement, la signature de la page partagée échouera.

La signature est correcte. Si les étapes ci-dessus ne peuvent pas résoudre votre problème (signature invalide), alors utilisez le problème d'url. Remarque : le compte officiel WeChat doit être configuré avec votre domaine de sécurité de débogage. name (vous pouvez configurer le nom de domaine de deuxième niveau : xxx.com au lieu de configurer plusieurs a.xxx.com/b.xxx.com, etc.).

Raison : WeChat ajoutera plusieurs paramètres à votre page actuelle lors du partage. Lorsque vous sha1, vous devez vous assurer que l'adresse URL est l'adresse après que WeChat vous ait ajouté des paramètres, afin qu'il ne signale pas config : invalide. signature.

Solution : L'URL avant sha1 doit être une URL normale qui peut être directement reconnue à l'œil nu après décodage. Si vous utilisez une page statique, avant de configurer wx.config, passez d'abord encodeURIComponent(. location.href.split ('#')[0]) transmet l'encodage de l'URL actuel au backend, qui est décodé par decodeURIComponent. Le code principal est le suivant :

page HTML frontale, encodant l'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
    });


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn