微信sdk实现禁止微信分享(使用原生php实现)


Posted in Javascript onNovember 15, 2019

在此之前我们已经学习过微信的sdk使用,但是之前实在easyWechat的php插件基础上实现的,具体可以参考:https://3water.com/article/174309.htm

这里我们来使用原生的php实现微信的sdk-禁止微信分享

一:引入所需要的js

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>

二:通过config接口注入权限验证配置

wx.config({
 debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
 appId: '', // 必填,公众号的唯一标识
 timestamp: , // 必填,生成签名的时间戳
 nonceStr: '', // 必填,生成签名的随机串
 signature: '',// 必填,签名
 jsApiList: [] // 必填,需要使用的JS接口列表
});

签名的生成步骤如下:

1:获取微信公众号的全局唯一接口调用凭据access_token

调取下面的接口获取access_token

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

get参数说明:

appid:微信公众号的唯一标识appId

secret:微信公众号的appsecret

根据上面的接口可以获取到微信公众号的全局唯一接口调用凭据access_token,接口返回结果如下:

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

2:根据access_token获取jsapi_ticket

调取下面的接口获取jsapi_ticket

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

get参数说明:

access_token:上面接口获取到的access_token

type:类型,这里指定填jsapi

根据上面的接口可以获取到jsapi_ticket,接口返回结果如下:

{
 "errcode":0,
 "errmsg":"ok",
 "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
 "expires_in":7200
}

3:根据获取到的jsapi_ticket和noncestr,timestamp,url生成签名

对所有待签名参数按照字段名的ASCII 码从小到大排序后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串,然后通过sha1加密生成签名

三:通过ready接口处理成功验证后在ready内写我们所需要的微信sdk接口

wx.ready(function(){
 // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

四:具体实现

根据如上说明,这里我们就以禁止微信分享sdk为例实现:

1:php端:

public function actionTicket()
{
  //开启session
  session_start();
  //appId
  $appId = 'wx73d0c47a64aa5315';
  //secret
  $appSecret = 'aba2793c10623350f6aeee5a728099d3';
  if (!isset($_SESSION['ticket'])){
    //获取微信公众号全局唯一接口调用凭据access_token
    $result = $this->getAccessToken($appId, $appSecret);
    $accessToken = $result['access_token'];
    //获取jsapi_ticket
    $getTicket = $this->getTicket($accessToken);
    $ticket = $getTicket['ticket'];
    $_SESSION['ticket'] = $ticket;
  }
  //jsapi_ticket(公众号用于调用微信JS接口的临时票据)
  $ticket = $_SESSION['ticket'];
  //当前时间戳
  $timestamp = time();
  //随机字符串
  $noncestr = $this->getRandCode();
  //当前url
  $url = $this->getUrl();
  $params = [
    'jsapi_ticket' => $ticket,
    'timestamp' => $timestamp,
    'noncestr' => $noncestr,
    'url' => $url,
  ];
  $options = $this->urlParams($params);
  //获取签名
  $signature = sha1($options);
  //将appId,timestamp,noncestr,signature渲染到页面
  return $this->render('ticket', [
    'appId' => $appId,
    'timestamp' => $timestamp,
    'noncestr' => $noncestr,
    'signature' => $signature,
  ]);
}
/*
 * 获取jsapi_ticket
 */
public function getTicket($accessToken)
{
  $params = [
    'access_token' => $accessToken,
    'type' => 'jsapi',
  ];
  $urlParams = $this->urlParams($params);
  $ticketUrl = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?' . $urlParams;
  $result = $this->http_curl($ticketUrl);
  return json_decode($result, true);
}
/*
 * 获取微信公众号的全局唯一接口调用凭据access_token
 */
public function getAccessToken($appId, $appSecret)
{
  $params = [
    'grant_type' => 'client_credential',
    'appid' => $appId,
    'secret' => $appSecret,
  ];
  $urlParams = $this->urlParams($params);
  $accessUrl = 'https://api.weixin.qq.com/cgi-bin/token?' . $urlParams;
  $result = $this->http_curl($accessUrl);
  return json_decode($result, true);
}
/*
 * 获取随机码
 */
function getRandCode($num = 16){
  $array = array(
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
    'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','v','z',
    '1','2','3','4','5','6','7','8','9','0',
  );
  $tmpstr='';
  $max = count($array);
  for($i=1; $i<=$num; $i++){
    $key = rand(0,$max-1); //'A' -> $array[0]
    $tmpstr .= $array[$key];
  }
  return $tmpstr;
}
/*
 * curl接口调用
 */
public function http_curl($url, $data=null) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  $result = curl_exec($curl);
  curl_close($curl);
  return $result;
}
/*
 * 字符串拼接
 */
public function urlParams($params)
{
  ksort($params);
  reset($params);
  $options = '';
  foreach ($params as $key => $value) {
    $options .= $key . '=' . $value .'&';
  }
  $options = rtrim($options, '&');
  return $options;
}
/*
 * 获取当前url
 */
public function getUrl()
{
  //获取协议类型
  $protocalPort = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
  //获取当前执行脚本的url
  $phpSelf = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
  $pathInfo = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
  $queryString = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '';
  $relateUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $phpSelf . (!empty($queryString) ? '?' . $queryString : $pathInfo);
  $url = $protocalPort . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $relateUrl;
  return $url;
}

2:前端:

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
<script>
  $(document).ready(function(){
    wx.config({
      debug: false, // 开启调试模式为true后可以通过alert弹窗将公众号签名等结果反馈出来
      appId: '<?= $appId ?>', // 必填,公众号的唯一标识
      timestamp: '<?= $timestamp ?>', // 必填,生成签名的时间戳
      nonceStr: '<?= $noncestr ?>', // 必填,生成签名的随机串
      signature: '<?= $signature ?>',// 必填,签名
      jsApiList: [
        "hideOptionMenu",
      ]
    });
    //配置成功以后config:ok
    wx.ready(function () {
      //隐藏右上角菜单接口
      wx.hideOptionMenu();
    })
  })
</script>

这样我们就是实现了原生php使用微信sdk

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

Javascript 相关文章推荐
JQuery.ajax传递中文参数的解决方法 推荐
Mar 28 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
Feb 27 Javascript
js中的前绑定和后绑定详解
Aug 01 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
Dec 15 Javascript
使用jquery提交form表单并自定义action的实现代码
May 25 Javascript
Javascript blur与click冲突解决办法
Jan 09 Javascript
Angular2使用Augury来调试Angular2程序
May 21 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 Javascript
详解利用eventemitter2实现Vue组件通信
Nov 04 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
Oct 19 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
Nov 15 #Javascript
微信小程序自定义导航栏(模板化)
Nov 15 #Javascript
在node环境下parse Smarty模板的使用示例代码
Nov 15 #Javascript
微信小程序自定义头部导航栏(组件化)
Nov 15 #Javascript
create-react-app中添加less支持的实现
Nov 15 #Javascript
taro小程序添加骨架屏的实现代码
Nov 15 #Javascript
详解Angular Karma测试的持续集成实践
Nov 15 #Javascript
You might like
获取远程文件大小的php函数
2010/01/11 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
window.open的功能全解析
2006/10/10 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
微信跳一跳python代码实现
2018/01/05 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
深入浅析Python传值与传址
2018/07/10 Python
python如何实现一个刷网页小程序
2018/11/27 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
小学毕业感言500字
2014/02/28 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
JavaScript中reduce()的用法
2022/05/11 Javascript