Heim  >  Artikel  >  WeChat-Applet  >  WeChat-Entwicklung – Verwendung von QR-Code mit Parametern

WeChat-Entwicklung – Verwendung von QR-Code mit Parametern

高洛峰
高洛峰Original
2017-03-30 16:17:451395Durchsuche

Kürzlich habe ich WeChat-bezogene Funktionen für die WeChat-PC-Webseite entwickelt. Aus der Sicht eines Anfängers sind die Dokumente öffentlicher WeChat-Konten immer noch schwer zu verstehen Laut den auf der Plattform bereitgestellten Dokumenten gibt es bei der Entwicklung von WeChat-QR-Codes immer noch viele Fallstricke. Ich werde meinen Entwicklungsprozess hier detaillierter aufzeichnen und hoffe, dass er für alle hilfreich ist.

Ich verwende das Authentifizierungsdienstkonto für diese Entwicklung.

1 Zugriff

Geben Sie zunächst das offizielle WeChat-Konto ein -> Grundkonfiguration

Das Folgende ist die grundlegende Konfigurationsseite. Diese Adresse ist eine Schnittstelle zum Akzeptieren von WeChat-Push-Ereignissen. Sie befindet sich im Action-Verzeichnis der Module (Dekoration). Erstellen Sie eine neue Klasse, zum Beispiel: WechatAction.class.php , und erstellen Sie eine neue öffentliche Methode in der Aktion, zum Beispiel: URLRedirect() , Dann lautet die eingegebene URL http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect , dann füllen Sie das Token aus, geben Sie das Token nach Belieben ein, EncodingAESKey oder nicht, dann klicken Sie auf Bestätigen, WeChat wird zu dieser URL gehen Senden Sie eine Get-Anfrage, die viele Parameter enthält, mit denen wir überprüfen können, ob der Zugriff vom WeChat-Server angefordert wird. Seine Anfrage ist das Wenn wir die Prüfung erfolgreich abgeschlossen haben, wird es so wie es ist an die Get-Anfrage zurückgegeben. Die Rückgabe ist hier weder return noch ajaxReturn. Wenn Sie echo verwenden, verwenden Sie einfach echo I('echostr'); direkt. Dann ist die Schnittstellenüberprüfung erfolgreich.

微信开发——带参数二维码的使用

2 Die Funktion des QR-Codes mit Parametern

Es gibt zwei Arten von QR-Codes mit Parametern, einen temporären QR-Code und einen permanenten QR-Code. Diesmal möchte ich jedoch eine Grenze für die Anzahl der permanenten QR-Codes haben Die implementierte Funktion dient dazu, dass Benutzer Produkte auf der Website nutzen können, ohne sich anzumelden, z. B. ein detailliertes Angebot für ein bestimmtes Produkt einzuholen, sich aber nicht registrieren, das Angebot aber zu diesem Zeitpunkt speichern möchten Generieren Sie einen QR-Code, und der Benutzer muss nur WeChat verwenden. Scannen Sie diesen QR-Code, und das offizielle öffentliche Konto sendet einen Tag lang eine grafische Nachricht an den Benutzer Sie haben es gerade erhalten, und Sie können es jederzeit anklicken, um es anzusehen und zum Preisvergleich mit Freunden zu teilen. Daher kann der temporäre QR-Code normal verwendet werden.

So verwende ich es. Hier ist eine Einführung in den gesamten Interaktionsprozess:

Wenn der Benutzer diesen QR-Code scannt, Wenn der Benutzer dem offiziellen Konto folgt, gelangt er direkt zur Konversationsseite mit dem offiziellen Konto. Der WeChat-Server sendet eine Nachricht an die im vorherigen Schritt festgelegte Server-URL, die einen benutzerdefinierten Parameter enthalten kann. Wenn der Benutzer dem offiziellen Konto nicht folgt, springt er zunächst zur Folgeseite des offiziellen Kontos. Nachdem er auf „Folgen“ geklickt hat, gelangt er direkt zur Konversationsseite des offiziellen Kontos Senden Sie eine Ereignisnachricht an die von uns festgelegte URL. Wir passen die Parameter an und können die nächste Aktion basierend auf diesem Parameter und Ereignistyp steuern.

3 Spezifischer Entwicklungsprozess

3.1 Access_token erhalten

Dieses access_token ist das Zertifikat für unser Programm zum Aufrufen der WeChat-Schnittstelle. Die aktuelle Gültigkeitsdauer beträgt 7200 Sekunden, daher müssen wir das access_token regelmäßig aktualisieren.

So erhalten Sie:

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

Die Parameter APPID und APPSECRET sind die APPID und APPSECRET unseres offiziellen Kontos, die im offiziellen WeChat-Konto zu finden sind. > Grundkonfiguration Es wurde festgestellt, dass bei erfolgreichem Aufruf die folgenden JSON-Daten zurückgegeben werden:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

Wobei access_token die Anmeldeinformationen der aufrufenden Schnittstelle und Expire_in das Token ist Gültigkeitsdauer.

Ich persönlich speichere das access_token in der Datenbank, speichere die Ablaufzeit und kapsele dann die öffentliche Funktion getWechatAccessToken(). Jedes Mal überprüfe ich, ob das Wenn es abgelaufen ist, rufen Sie es erneut ab. Andernfalls können Sie einfach das in der Datenbank gespeicherte Access_token verwenden. Die Häufigkeit, mit der dieses Access_token täglich abgerufen werden kann, sollte begrenzt sein. Das Folgende ist die spezifische Implementierung von getWechatAccessToken():

 //获取access_token
function getWechatAccessToken(){
    $wechatInfo = M('wechat_info')->select();
    $wechatInfo = array_reduce($wechatInfo, create_function('$result, $v', '$result[$v["conf_name"]] = $v;return $result;'));
    $expireTime = $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES']['conf_value'];                             //前面不用管,是我数据库相应设置

    if (time() < $expireTime){              //access_token未过期
        return $wechatInfo[&#39;PUBLIC_WECHAT_ACCESSTOKEN&#39;][&#39;conf_value&#39;];
    }else{                                  //access_token过期,重新获取
        $baseUrl = C(&#39;WECHAT_PUBLIC_GET_ACCESS_TOKEN&#39;);
        $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));
        $result = file_get_contents($url);
        $result = json_decode($result, true);

        if (array_key_exists(&#39;errorcode&#39;, $result)){        //失败重试一次
            return false;
        }else{
            M(&#39;wechat_info&#39;)->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN'))->save(array('conf_value' => $result['access_token']));
            M('wechat_info')->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES'))->save(array('conf_value' => time()+$result['expires_in']-200));
            return $result['access_token'];
        }
    }
}
C('WECHAT_PUBLIC_GET_ACCESS_TOKEN') = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

Nachdem wir dies gekapselt haben, können wir es jedes Mal beruhigt verwenden.

3.2 Temporären QR-Code erstellen

3.2.1 Ticket erhalten

      请求方式: 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}}}

Das TOKEN in der Schnittstellen-URL ist das access_token, das wir in 3.1 erhalten haben. Expire_seconds in den Post-Daten ist die Gültigkeitsdauer des QR-Codes, die bis zu 30 Tage beträgt Für temporäre QR-Codes ist es QR_SCENE. Es ist eine 32-Bit-Ganzzahl, die ich als ID der Bestellung festgelegt habe Wir legen diesen Wert für die Schnittstelle fest. Anschließend werden die entsprechenden Bestelldaten abgerufen und auf der Webseite angezeigt.

Das Folgende ist eine gekapselte Methode zum Generieren eines temporären QR-Codes:

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

Die Methode ist api_notice_increment() Es handelt sich um eine POST-Methodenfunktion, die ich gekapselt habe. Vielleicht weil die WeChat-Schnittstelle strenge Einschränkungen für POST-Methoden und -Parameter hat, habe ich schließlich eine gepackte Funktion gefunden, die verwendet werden kann Online. Ich schlage vor, dass Sie es zuerst selbst ausprobieren. Wenn WeChat einen Fehler zurückgibt, verwenden Sie einfach diesen. Als ich die WeChat-Schnittstelle getestet habe, habe ich alle Fehler getestet und zurückgegeben, und es muss sich um eine JSON-Zeichenfolge handeln. Es muss eine sehr strenge JSON-Zeichenfolge sein. Hier ist diese Methode:

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, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    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;
    }

}

getTemporaryQrcode() In der Konfigurationsdatei gibt es einen Parameter, den jeder sehen kann, bei dem es sich eigentlich um den WeChat-Schnittstellenlink handelt:

C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##

Der Rückgabewert dieser Schnittstelle ist:

{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}

Wobei Ticket der Berechtigungsnachweis ist, den wir für den nächsten Anruf verwenden , „expire_seconds“ ist die Gültigkeitsdauer des QR-Codes und „url“ ist der Link, den wir nach dem Scannen des QR-Codes generiert haben. Wenn wir also die Methode zum Generieren von QR-Code selbst implementieren, müssen wir den nächsten Aufruf nicht bei diesem Schritt durchführen und den Wert der URL direkt zurückgeben und dann den Wert dieser URL verwenden, um den QR-Code zu generieren und lokal speichern. Mit phpqrcode können Sie QR-Codes in PHP generieren, was sehr einfach zu verwenden ist. Auch der nächste Schritt wird kurz erwähnt:

3.2.2 Beschaffung der QR-Code-Adresse

   请求方式: GET
   接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET

Der Rückgabewert dieser Schnittstelle ist ein Bild, das direkt angezeigt oder heruntergeladen werden kann. Wir haben es im Detail verwendet, daher wissen wir nicht, wie wir es anzeigen sollen.

3.3 Was passiert, nachdem der Benutzer den QR-Code gescannt hat

3.3.1 扫描后发生了什么

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

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

 用户未关注时,进行关注后的事件推送
<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>

   用户已关注时的事件推送

 <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>

 

3.3.2 我们要做些什么

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

public function urlRedirect(){        
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];        
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', 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]);
        }
    }

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

  下面是 sendMessage() 方法:

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

  其中  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"
         }
         ]
    }
}

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

更多微信开发—带参数二维码的使用 相关文章请关注PHP中文网!

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