Maison > Applet WeChat > Développement WeChat > Explication détaillée d'exemples de développement de codes QR avec paramètres sur WeChat

Explication détaillée d'exemples de développement de codes QR avec paramètres sur WeChat

Y2J
Libérer: 2017-05-03 10:42:59
original
1706 Les gens l'ont consulté

Récemment, j'ai développé des fonctions liées à WeChat pour la page Web WeChat PC. Du point de vue d'un novice, les documents des comptes publics WeChat sont encore difficiles à comprendre. La plupart des publications trouvées en ligne sont essentiellement des copies de WeChat. comptes publics. Selon les documents fournis sur la plateforme, il existe encore de nombreux pièges dans le processus de développement des codes QR WeChat avec des paramètres. Je vais enregistrer mon processus de développement plus en détail ici, en espérant que cela sera utile à tout le monde.

J'utilise le compte du service d'authentification pour ce développement.

1 Accès

Entrez d'abord dans le compte officiel WeChat -> Configuration de base

Ce qui suit est la page de configuration de base. Remplissez l'adresse du serveur dans l'URL. Cette adresse est une interface pour accepter les événements push WeChat. J'ai développé le programme en utilisant le framework thinkPHP. des Modules (Décoration). Créez une nouvelle classe, par exemple : WechatAction.class.php , et créez une nouvelle méthode publique dans l'Action, par exemple : URLRedirect() , alors l'URL renseignée est http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect , puis remplissez le Token, remplissez le Token comme vous le souhaitez, EncodingAESKey ou non, puis cliquez sur Confirmer, WeChat ira à cette URL. Envoyez une requête get, qui contient de nombreux paramètres, dont la plupart nous permettent de vérifier si l'accès est demandé par le serveur WeChat. Je ne l'ai pas vérifié moi-même. si nous vérifions avec succès, il sera renvoyé à la requête get tel quel. Un paramètre de echostr, le retour ici n'est pas return, ni ajaxReturn Si vous utilisez echo, si vous le développez avec thinkPHP, utilisez simplement echo. I('echostr'); directement. La vérification de l'interface est alors réussie.

2 QR code avec paramètres Fonction

Il existe deux types de codes QR avec paramètres dans WeChat, l'un est un code QR temporaire et l'autre est un code QR permanent, mais le code QR permanent est Il y a une limite à la nombre d'articles générés. La fonction que je souhaite implémenter cette fois est que les utilisateurs peuvent utiliser les produits sur le site Web sans se connecter. Par exemple, ils peuvent obtenir un devis détaillé pour un certain produit, mais ils ne souhaitent pas s'inscrire, mais ils Je souhaite également enregistrer le devis. À ce moment-là, la page Web peut générer un code QR. Tant que l'utilisateur scanne le code QR avec WeChat, le compte public officiel enverra un message graphique à l'utilisateur pendant un jour. on clique sur le message graphique, ce sera le devis que l'utilisateur vient d'obtenir, et il peut cliquer pour le visualiser à tout moment et le partager avec des amis pour comparer les prix. Par conséquent, le code QR temporaire peut être utilisé normalement.

Voici comment je l'utilise. Voici une introduction à l'ensemble du processus d'interaction :

Lorsque l'utilisateur scanne ce code QR, si l'utilisateur Après avoir suivi le compte officiel, l'utilisateur entrera directement dans la page de conversation avec le compte officiel. Le serveur WeChat enverra un message à l'URL du serveur que nous avons définie à l'étape précédente, qui peut contenir un paramètre personnalisé. Si l'utilisateur ne suit pas le compte officiel, l'utilisateur accédera d'abord à la page de suivi du compte officiel. Après que l'utilisateur ait cliqué pour suivre, il entrera directement dans la page de conversation du compte officiel. À ce moment, le serveur WeChat le fera également. envoyez un message d'événement à l'URL que nous avons définie, portant Nous personnalisons les paramètres et nous pouvons contrôler l'action suivante en fonction de ce paramètre et de ce type d'événement.

3 Processus de développement spécifique

3.1 Obtenez access_token

Cet access_token est le certificat permettant à notre programme d'appeler l'interface WeChat. La période de validité actuelle est de 7 200 secondes, nous devons donc mettre à jour régulièrement l'access_token.

Comment obtenir :

方法 : GET
url :https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
Copier après la connexion

Les paramètres APPID et APPSECRET sont les APPID et APPSECRET de notre compte officiel, que l'on retrouve dans le compte officiel WeChat- > Configuration de base On constate que si l'appel réussit, les données JSON suivantes seront renvoyées :

{"access_token":"ACCESS_TOKEN","expires_in":7200}
Copier après la connexion

Où access_token est l'identifiant de l'interface appelante et expire_in est le jeton. durée de validité.

Je stocke personnellement le access_token dans la base de données, enregistre le délai d'expiration, puis encapsule la fonction publique getWechatAccessToken() À chaque fois, je vérifie d'abord si le. access_token a expiré. S'il a expiré, récupérez-le à nouveau, sinon utilisez simplement le access_token enregistré dans la base de données. J'ai oublié où je l'ai vu. Le nombre de fois que ce access_token peut être obtenu chaque jour devrait être limité. Voici l'implémentation spécifique de getWechatAccessToken() :

 1 //获取access_token
 2 function getWechatAccessToken(){ 3     $wechatInfo = M('wechat_info')->select(); 4     $wechatInfo = array_reduce($wechatInfo, create_function('$result, $v', '$result[$v["conf_name"]] = $v;return $result;')); 5     $expireTime = $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES']['conf_value'];                             //前面不用管,是我数据库相应设置
 6 
 7     if (time() < $expireTime){              //access_token未过期
 8         return $wechatInfo[&#39;PUBLIC_WECHAT_ACCESSTOKEN&#39;][&#39;conf_value&#39;]; 9     }else{                                  //access_token过期,重新获取10         $baseUrl = C(&#39;WECHAT_PUBLIC_GET_ACCESS_TOKEN&#39;);11         $url = str_replace("##APPSECRET##", $wechatInfo[&#39;PUBLIC_WECHAT_APPSECRET&#39;][&#39;conf_value&#39;], str_replace("##APPID##", $wechatInfo[&#39;PUBLIC_WECHAT_APPID&#39;][&#39;conf_value&#39;], $baseUrl));12         $result = file_get_contents($url);13         $result = json_decode($result, true);14 
15         if (array_key_exists(&#39;errorcode&#39;, $result)){        //失败重试一次16             return false;17         }else{18             M(&#39;wechat_info&#39;)->where(array(&#39;conf_name&#39; => &#39;PUBLIC_WECHAT_ACCESSTOKEN&#39;))->save(array(&#39;conf_value&#39; => $result[&#39;access_token&#39;]));19             M(&#39;wechat_info&#39;)->where(array(&#39;conf_name&#39; => &#39;PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES&#39;))->save(array(&#39;conf_value&#39; => time()+$result[&#39;expires_in&#39;]-200));20             return $result[&#39;access_token&#39;];21         }22     }23 }
Copier après la connexion
C(&#39;WECHAT_PUBLIC_GET_ACCESS_TOKEN&#39;) = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
Copier après la connexion

Après avoir encapsulé cela, nous pouvons l'utiliser en toute tranquillité d'esprit à chaque fois.

3.2 Créer un code QR temporaire

3.2.1 Obtenir un ticket

      请求方式: POST
       接口:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
        POST数据: {"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
Copier après la connexion

Le TOKEN dans l'URL de l'interface est le access_token que nous avons obtenu en 3.1. expire_seconds dans les données de publication est la durée de validité du code QR, qui peut aller jusqu'à 30 jours. pour les codes QR temporaires. Il s'agit de QR_SCENE. scene_id est notre paramètre personnalisé. Il s'agit d'un entier non nul de 32 bits. Je le définis comme identifiant de la commande dans l'application. Lorsque le serveur WeChat envoie l'événement, il est renvoyé. cette valeur à l'interface que nous avons définie. Ensuite, je le ferai. En fonction de cette valeur, les données de commande correspondantes sont obtenues et affichées sur la page Web. C'est un sujet ultérieur.

Voici la méthode encapsulée pour générer un code QR temporaire :

//创建临时二维码function getTemporaryQrcode($orderId){    $accessToken = getWechatAccessToken();    $url = str_replace("##TOKEN##", $accessToken, C(&#39;WECHAT_PUBLIC_GET_TEMPORARY_TICKET&#39;));    $qrcode = &#39;{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": &#39;.$orderId.&#39;}}}&#39;;    $result = api_notice_increment($url, $qrcode);    $result = json_decode($result, true);    return urldecode($result[&#39;url&#39;]);
}
Copier après la connexion

La méthode est api_notice_increment() C'est une fonction de méthode POST que j'ai encapsulée. J'ai essayé de nombreuses méthodes POST. Peut-être parce que l'interface WeChat a des restrictions strictes sur les méthodes et les paramètres POST, cela a fait perdre beaucoup de temps. Finalement, j'en ai trouvé une qui peut être utilisée en ligne. .POST, je vous suggère de l'essayer vous-même d'abord. Si WeChat renvoie une erreur, utilisez simplement ceci. Au moins lorsque j'ai testé l'interface WeChat, j'ai utilisé Postman pour tester et renvoyé toutes les erreurs, et ce doit être une chaîne JSON. doit être une chaîne JSON très stricte. Voici cette méthode :

function api_notice_increment($url, $data){    $ch = curl_init();    $header = "Accept-Charset: utf-8";
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_USERAGENT, &#39;Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)&#39;);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $tmpInfo = curl_exec($ch);    if (curl_errno($ch)) {
        curl_close( $ch );        return $ch;
    }else{
        curl_close( $ch );        return $tmpInfo;
    }
}
Copier après la connexion

getTemporaryQrcode() Il y a un paramètre dans le fichier de configuration que tout le monde peut voir, qui est en fait le lien de l'interface WeChat :

C(&#39;WECHAT_PUBLIC_GET_TEMPORARY_TICKET&#39;) = https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##
Copier après la connexion

La valeur de retour de cette interface est :

{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}
Copier après la connexion

Où ticket est l'identifiant que nous utilisons pour passer le prochain appel , expire_seconds est la période de validité du code QR et url est le lien que nous avons généré après avoir scanné le code QR. Donc, si nous implémentons nous-mêmes la méthode de génération de code QR, nous n'avons pas besoin de passer l'appel suivant. Je m'arrête à cette étape et renvoie directement la valeur de l'url, puis j'utilise la valeur de cette url pour générer le code QR. et stockez-le localement. Vous pouvez utiliser phpqrcode pour générer des codes QR en PHP, ce qui est très simple à utiliser. La prochaine étape est également brièvement évoquée :

3.2.2 Obtention de l'adresse du code QR

   请求方式: GET
   接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
Copier après la connexion

La valeur de retour de cette interface est une image, qui peut être affichée ou téléchargée directement. Nous l'avons utilisée en détail, nous ne savons donc pas comment l'afficher.

3.3 Que se passe-t-il une fois que l'utilisateur a scanné le code QR

3.3.1 Que se passe-t-il après le scanner Quoi

  上面提到了,用户扫描我们生成的临时二维码,如果用户未关注公众号,则首先会跳转到公众号的关注页面,点击关注后,会进入公众号的会话页面,同时会给我们设置的接口推送一个事件。如果用户已经关注了,用户微信会直接跳转到公众号会话页面,然后微信服务器会给我们设置的接口推送一个事件。

  用户关注与否微信服务器给我们推送的事件是差不多的,只是新关注用户推送的事件中scene_id前面会加一个前缀。下面是微信公众平台文档的说明:

 用户未关注时,进行关注后的事件推送
Copier après la connexion
<xml><ToUserName><![CDATA[toUser]]></ToUserName>        //开发者微信号<FromUserName><![CDATA[FromUser]]></FromUserName>       //发送者账号(openid)<CreateTime>123456789</CreateTime>                //消息创建时间(整型)<MsgType><![CDATA[event]]></MsgType>              //消息类型 event<Event><![CDATA[subscribe]]></Event>              //事件类型(subscribe)<EventKey><![CDATA[qrscene_123123]]></EventKey>        //事件KEY值,qrscene_为前缀,后面为二维码参数值<Ticket><![CDATA[TICKET]]></Ticket>               //二维码ticke值,可以用来换取二维码图片</xml>
Copier après la connexion

  用户已关注时的事件推送

 <xml><ToUserName><![CDATA[toUser]]></ToUserName>        //开发者微信号<FromUserName><![CDATA[FromUser]]></FromUserName>     //发送者账号(openid)<CreateTime>123456789</CreateTime>             //消息创建时间<MsgType><![CDATA[event]]></MsgType>                    //消息类型event<Event><![CDATA[SCAN]]></Event>               //事件类型 event<EventKey><![CDATA[SCENE_VALUE]]></EventKey>            //事件key值,是一个32位无符号整数,即创建二维码时的二维码scene_id<Ticket><![CDATA[TICKET]]></Ticket>                     //二维码的ticke,可以用来换取二维码图片</xml>
Copier après la connexion

3.3.2 我们要做些什么

  我们需要在自己填写的URL接口中接收这个事件,然后拿到我们需要的东西做我们想干的事儿。因为我要实现的功能比较简单,只需要拿到scene_id即可,因为这是我要展示给用户看的订单数据。下面是我写的接收和处理部分,比较简单,主要看一下应该怎么接收微信推送的事件:

public function urlRedirect(){        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];        $postObj = simplexml_load_string($postStr, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);        $fromUsername = (string)$postObj->FromUserName;        $EventKey = trim((string)$postObj->EventKey);        $keyArray = explode("_", $EventKey);        if (count($keyArray) == 1){         //已关注者扫描
            $this->sendMessage($fromUsername, $EventKey);
        }else{                   //未关注者关注后推送事件
            $this->sendMessage($fromUsername, $keyArray[1]);
        }
    }
Copier après la connexion

  我没有使用其他参数,只是根据不同的推送事件拿到我想要的订单ID,然后这时候其实相当于你在这里用公众号的客服在跟扫码的这个用户对话,上段代码中调用的sendMessage()是使用客户账号给扫码用户发送一个图文消息,因为我在拿scen_id的同时也拿到了用户的openid,可以利用这个给用户发送消息。

  下面是 sendMessage() 方法:

//给用户发送图文消息,点击跳转到报价页面
    public function sendMessage($openid,$orderId){        $url = str_replace(&#39;##TOKEN##&#39;, getWechatAccessToken(), C(&#39;WECHAT_SEND_MESSAGE&#39;));        $redirectUrl = str_replace("##ORDERID##", $orderId, str_replace("##OPENID##", $openid, C(&#39;WECHAT_REDIRECT_URL_PRE&#39;)));        $orderInfo = M(&#39;order&#39;)->where(array(&#39;orderid&#39; => $orderId))->field(array(&#39;totalMoney&#39;, &#39;savedMoney&#39;, &#39;roomarea&#39;))->find();        $description = str_replace("##ROOMAREA##", intval($orderInfo[&#39;roomarea&#39;] * 1.25), C(&#39;WECHAT_MESSAGE_BRIEF&#39;));        $description = str_replace("##TOTALBUDGET##", $orderInfo[&#39;totalMoney&#39;], $description);        $description = str_replace("##MARKETBUDGET##", $orderInfo[&#39;totalMoney&#39;]+$orderInfo[&#39;savedMoney&#39;], $description);        $description = str_replace("##SAVEMONEY##", $orderInfo[&#39;savedMoney&#39;], $description);        $dataStr = &#39;{"touser":"&#39; . $openid . &#39;","msgtype":"news","news":{"articles":[{"title":"&#39; . C(&#39;WECHAT_MESSAGE_TITLE&#39;) .
            &#39;","description":"&#39; . $description . &#39;","url":"&#39; . $redirectUrl . &#39;","picurl":"&#39; . C(&#39;WECHAT_MESSAGE_PICURL&#39;) . &#39;""}]}}&#39;;
        api_notice_increment($url, $dataStr);
    }
Copier après la connexion

  其中 C('WECHAT_SEND_MESSAGE') = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=##TOKEN##' 至于下面的一大段str_replace,就是在组给用户发送的文字而已,需要注意$dataStr的格式,这里面要求JSON字符串比较严格,必须所有的字符串都用双引号括起来。微信接口对POST参数的限制真心严格。

  下面是微信公众平台开发者文档中要求发送图文消息的POST data格式:

{
    "touser":"OPENID",
    "msgtype":"news",
    "news":{
        "articles": [
         {
             "title":"Happy Day",
             "description":"Is Really A Happy Day",
             "url":"URL",
             "picurl":"PIC_URL"
         },
         {
             "title":"Happy Day",
             "description":"Is Really A Happy Day",
             "url":"URL",
             "picurl":"PIC_URL"
         }
         ]
    }
}
Copier après la connexion

  其中url是用户点击这个消息之后打开的地址,这个时候我就组了一个自己网站的地址,是一个get请求地址,里面携带参数是用户的openid和订单id,这样用户点击开图文消息就可以看到自己刚才下单的内容了,因为需要在网页上展示用户的微信头像和昵称,所以我把openid也放到参数里,在页面加载前先拿到用户的个人信息和订单数据,再展示网页。这样流程:用户未登录下单 -> 生成微信二维码 -> 用户扫码关注公众号 -> 查看订单详细信息 就完成了。而且因为这个图文消息打开后的链接携带的参数是这个用户的额openid和其下单的订单ID,不管分享到哪儿,用什么浏览器打开都是可以访问的,且展示的也是这个用户的头像和昵称信息,这也是我要实现的一个效果。

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal