PHP微信分享开发详解


Posted in PHP onJanuary 14, 2017

 分享一个php微信端开发的经验,有时候当一个项目或工程需要微信端分享之后做一系列事件那么我们就需要获取到微信分享这个动作,也就是说我们已经知道了当前这个东西已经被分享了 ,那么走微信默认的分享显然是不行的我们需要自己动手来配置微信分享,当用户分享时走的是我们预定好的程序那么我们就可以轻松实现分享之后所做的事情。

  在页面端主要是一个js如下:

<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: '{$appid}', // 必填,公众号的唯一标识
   timestamp:{$timestamp} , // 必填,生成签名的时间戳
   nonceStr: '{$nonceStr}', // 必填,生成签名的随机串
   signature: '{$signature}',// 必填,签名,见附录1
   jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
 });

 wx.ready(function(){
  //分享给朋友
  wx.onMenuShareAppMessage({
    title: {$title}, // 分享标题 此处$title可在控制器端传递也可在页面传递 页面传递讲解在下面哦
    desc: {$desc}, //分享描述
    link: {$link}, // 分享链接
    imgUrl: {$imgurl}, // 分享图标
    type: '', // 分享类型,music、video或link,不填默认为link
    dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
    success: function () {
       alert('分享成功');
    },
    cancel: function () {
      // 用户取消分享后执行的回调函数
      // alert('取消分享');
    }
  });
  //分享到朋友圈
   wx.onMenuShareTimeline({
    title: {$title}, // 分享标题
    desc: {$desc}, // 分享描述
    link: {$link}, // 分享链接
    imgUrl: {$imgurl}, // 分享图标
    success: function () {
      // 用户确认分享后执行的回调函数
    },
    cancel: function () {
      // 用户取消分享后执行的回调函数
    }
  });
 });

</script>


 

当wx.config配置好后程序才会接着走下面的分享,此处调试可将false改成true若配置好那么正常弹出ok等信息 若未配置好 那么此处改成true也不会有任何弹出效果

wx.config需要控制器传来四个参数即appId、timestamp、nonceStr、signature;控制器代码如下:

<?php

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

$this->assign('appid',$signPackage["appId"]);
$this->assign('timestamp',$signPackage["timestamp"]);
$this->assign('nonceStr',$signPackage["nonceStr"]);
 $this->assign('signature',$signPackage["signature"]);

在这里就配置好了wx.config,还可以接着穿title等信息 在这里举个例子

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

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['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 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['access_token'];
   // 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);
 }
}

讲到这里微信分享就告一段落了 但是有瑕疵哦 如果我们想动态传递参数怎么办  也就是说当页面信息wx.config配置好后我们突然又想重新赋值给$title等变量信息 怎么办?

我们可以这样  讲分享写在一个方法里面 如下(大致代码):

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

解释一下啊 从控制器进入页面已经配置好了分享内的title等信息  那么在配置好之后我又想在页面重新给title值 那么就是这个方法了 页面复制代码如下

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

easy吧 小伙伴们 如想详细了解微信端此功能和其他功能可参考手册

链接地址:https://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html(分享功能在手册中的微信网页开发-->微信JS-SDK 右面就可以看到了)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php创建多级目录代码
Jun 05 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
php 文件上传代码(限制jpg文件)
Jan 05 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
PHP session会话的安全性分析
Sep 08 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
PHP程序员基本要求和必备技能
May 09 PHP
php中删除、清空session的方式总结
Oct 09 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
PHP count_chars()函数讲解
Feb 14 PHP
常用PHP封装分页工具类
Jan 14 #PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 #PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 #PHP
php 解决扫描二维码下载跳转问题
Jan 13 #PHP
PHP使用递归算法无限遍历数组示例
Jan 13 #PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
Jan 13 #PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 #PHP
You might like
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
深入学习Python中的上下文管理器与else块
2017/08/27 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
会计自荐书
2013/12/02 职场文书
行政人员工作职责
2013/12/05 职场文书
目标管理责任书
2014/04/15 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python