Maison  >  Article  >  Applet WeChat  >  Explication détaillée du développement du partage PHP WeChat

Explication détaillée du développement du partage PHP WeChat

高洛峰
高洛峰original
2017-01-16 14:00:161515parcourir

Partagez une expérience de développement PHP WeChat. Parfois, lorsqu'un projet ou un projet doit être partagé sur WeChat pour réaliser une série d'événements, nous devons alors obtenir l'action de partage WeChat, ce qui signifie que nous savons déjà que l'élément en cours a été activé. a été partagé, il n'est évidemment pas possible d'utiliser le partage par défaut de WeChat. Nous devons configurer nous-mêmes le partage WeChat. Lorsque les utilisateurs partagent, ils suivent nos procédures prédéterminées, afin que nous puissions facilement réaliser ce qu'ils font après le partage.

Côté page, il y a principalement un js comme suit :

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
 
<script>
wx.config({
   debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
   appId: &#39;{$appid}&#39;, // 必填,公众号的唯一标识
   timestamp:{$timestamp} , // 必填,生成签名的时间戳
   nonceStr: &#39;{$nonceStr}&#39;, // 必填,生成签名的随机串
   signature: &#39;{$signature}&#39;,// 必填,签名,见附录1
   jsApiList: [&#39;onMenuShareAppMessage&#39;,&#39;onMenuShareTimeline&#39;] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
 });
 
 wx.ready(function(){
  //分享给朋友
  wx.onMenuShareAppMessage({
    title: {$title}, // 分享标题 此处$title可在控制器端传递也可在页面传递 页面传递讲解在下面哦
    desc: {$desc}, //分享描述
    link: {$link}, // 分享链接
    imgUrl: {$imgurl}, // 分享图标
    type: &#39;&#39;, // 分享类型,music、video或link,不填默认为link
    dataUrl: &#39;&#39;, // 如果type是music或video,则要提供数据链接,默认为空
    success: function () {
       alert(&#39;分享成功&#39;);
    },
    cancel: function () {
      // 用户取消分享后执行的回调函数
      // alert(&#39;取消分享&#39;);
    }
  });
  //分享到朋友圈
   wx.onMenuShareTimeline({
    title: {$title}, // 分享标题
    desc: {$desc}, // 分享描述
    link: {$link}, // 分享链接
    imgUrl: {$imgurl}, // 分享图标
    success: function () {
      // 用户确认分享后执行的回调函数
    },
    cancel: function () {
      // 用户取消分享后执行的回调函数
    }
  });
 });
 
</script>

Lorsque wx.config est configuré, le programme procédera au partage suivant Vous pouvez changer false en true. pour le débogage ici. S'il est configuré, ok et d'autres informations apparaîtront normalement. S'il n'est pas configuré, le changer en true n'aura aucun effet pop-up

wx.config nécessite quatre paramètres. le contrôleur, à savoir appId, timestamp, nonceStr et signature ; Le code du contrôleur est le suivant :

<?php
 
$jssdk = new \Home\Util\JSSDK(C(&#39;APPID&#39;), C(&#39;SECRET&#39;));//此处C里面的东西为你所使用的公众号的appid和secret,这俩个东西可在微信公众平台获取到 不详细解释 找不到追加评论(讲解) JSSDK文件代码在下
$signPackage = $jssdk->GetSignPackage();
 
$this->assign(&#39;appid&#39;,$signPackage["appId"]);
$this->assign(&#39;timestamp&#39;,$signPackage["timestamp"]);
$this->assign(&#39;nonceStr&#39;,$signPackage["nonceStr"]);
 $this->assign(&#39;signature&#39;,$signPackage["signature"]);

Le wx.config est configuré ici, et vous pouvez également transmettre le titre et d'autres informations. Voici un exemple

$this->assign( 'title',$title);

Code du fichier JSSDK :

<?php
namespace Home\Util;
use Think\Controller;
class JSSDK{
 private $appId;
 private $appSecret;
 public function __construct($appId, $appSecret) {
  $this->appId = $appId;
  $this->appSecret = $appSecret;
 }
 public function getSignPackage() {
  $jsapiTicket = $this->getJsApiTicket();
  // 注意 URL 一定要动态获取,不能 hardcode.
  $protocol = (!empty($_SERVER[&#39;HTTPS&#39;]) && $_SERVER[&#39;HTTPS&#39;] !== &#39;off&#39; || $_SERVER[&#39;SERVER_PORT&#39;] == 443) ? "https://" : "http://";
  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  $timestamp = time();
  $nonceStr = $this->createNonceStr();
  // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
  $signature = sha1($string);
  $signPackage = array(
   "appId"   => $this->appId,
   "nonceStr" => $nonceStr,
   "timestamp" => $timestamp,
   "url"    => $url,
   "signature" => $signature,
   "rawString" => $string
  );
  return $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;
 }
 public function getJsApiTicket() {
  // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
  $data = json_decode($this->get_php_file("jsapi_ticket.php"));
  if ($data->expire_time < time()) {
   $accessToken = $this->getAccessToken();  
   // 如果是企业号用以下 URL 获取 ticket
   // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$accessToken&type=jsapi";
   $res = json_decode($this->httpGet($url));
   $ticket = $res->ticket;
   // var_dump($url);
   if ($ticket) {
    $data->expire_time = time() + 7000;
    $data->jsapi_ticket = $ticket;
    $this->set_php_file("jsapi_ticket.php", json_encode($data));
   }
  } else {
   $ticket = $data->jsapi_ticket;
  }
  return $ticket;
 }
 public function getAccessToken() {
  // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
  $data = json_decode($this->get_php_file("access_token.php")); 
  if ($data->expire_time < time()) {
   // 如果是企业号用以下URL获取access_token
   // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
   $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
   $res = $this->getJson($url);
   $access_token = $res[&#39;access_token&#39;];
   // var_dump($res);
   if ($access_token) {
    $data->expire_time = time() + 7000;
    $data->access_token = $access_token;
    $this->set_php_file("access_token.php", json_encode($data));
   }
  } else {
   $access_token = $data->access_token;
  }
  return $access_token;
  // $aa = $access_token;
  // var_dump($aa);
 }
 //获取access_token
 public function getJson($url){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   $output = curl_exec($ch);
   curl_close($ch);
   // var_dump(json_decode($output, true));
   return json_decode($output, true);
 }
 //获取ticket
 private function httpGet($url) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  // curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
  // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  $res = curl_exec($curl);
  // var_dump($res);
  curl_close($curl);  
  return $res;
 }
 private function get_php_file($filename) {
  return trim(substr(file_get_contents($filename), 15));
  // echo trim(substr(file_get_contents($filename), 15));die;
  // $aa = trim(substr(file_get_contents($filename), 15));
 }
 private function set_php_file($filename, $content) {
  $fp = fopen($filename, "w");
  fwrite($fp, "<?php exit();?>" . $content);
  fclose($fp);
 }
}

À ce stade, le partage WeChat arrive à sa fin, mais il y a des défauts. Que faire si nous voulons transmettre des paramètres dynamiquement ? Que devons-nous faire si nous voulons soudainement réaffecter des informations variables telles que $title après la configuration des informations de la page wx.config ?

Nous pouvons écrire le partage dans une méthode comme suit (code approximatif) :

<script>
var zl= function (title,link,imgurl,desc){
 wx.ready(function(){
  //分享给朋友
  wx.onMenuShareAppMessage({
    title: title, // 分享标题
    desc: desc, //分享描述
    link: link, // 分享链接
    imgUrl: imgurl, // 分享图标
    type: &#39;&#39;, // 分享类型,music、video或link,不填默认为link
    dataUrl: &#39;&#39;, // 如果type是music或video,则要提供数据链接,默认为空
    success: function () {
       alert(&#39;分享成功&#39;);
    },
    cancel: function () {
      // 用户取消分享后执行的回调函数
      // alert(&#39;取消分享&#39;);
    }
  });
  //分享到朋友圈
   wx.onMenuShareTimeline({
    title: title, // 分享标题
    desc: desc, // 分享描述
    link: link, // 分享链接
    imgUrl: imgurl, // 分享图标
    success: function () {
      // 用户确认分享后执行的回调函数
    },
    cancel: function () {
      // 用户取消分享后执行的回调函数
      // alert(&#39;已取消分享&#39;);
    }
  });
 });
};
</script>

Expliquez que le titre et les autres informations du partage ont été configurés à partir du contrôleur. , je veux redonner la valeur du titre sur la page, c'est donc la méthode Le code de copie de la page est le suivant

<script>
zl(title,link,imgurl,desc);
</script>

facile les amis, si vous voulez en savoir plus. à propos de cette fonction sur WeChat et d'autres fonctions, veuillez vous référer au manuel

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun, et j'espère également que tout le monde prendra en charge PHP. Site chinois.

Pour des articles plus détaillés sur le partage et le développement de PHP WeChat, veuillez faire attention au site Web PHP 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
Article précédent:js API de partage WeChatArticle suivant:js API de partage WeChat