微信分享

  • 1、微信后台配置
  • 2、后端代码
  • 3、前端代码weixin-share.html

文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

1、微信后台配置

设置与开发/公众号设置 / 功能设置 / JS接口安全域名 (配置网页所用的域名, 【需通过备案】)基本配置 / IP白名单 (将服务器公网ip配置到此处)

2、后端代码

PHP版 参照官网给出的示例,稍作改造

PHP版本 7.1

目录结构:

./JSSDK.php       微信分享必要参数获取基本接口JSSDKCache.php  通过继承,实现对access_token、jsapi_ticket数据的缓存RedisService.php   Redis缓存服务WeixinService.php  配置具体的微信参数,调用JSSDKCache.phpWeixinController.php   对外提供数据接口

用到的第三方库

# 网络请求
composer require rmccue/requests# Redis客户端
composer require  predis/predis

JSSDK.php

<?php
namespace app\utils\weixin;use Requests;/*** 微信分享必要参数获取基本接口** Class JSSDK* @package app\utils\weixin*/
class JSSDK
{// 开发者IDprotected $appId;// 开发者密码(AppSecret)protected $appSecret;public function __construct($appId, $appSecret){$this->appId     = $appId;$this->appSecret = $appSecret;}public function getSignPackage($jsapi_ticket, $url){$timestamp = time();$nonceStr  = $this->createNonceStr();// 这里参数的顺序要按照 key 值 ASCII 码升序排序$string = "jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr&timestamp=$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;}/*** 获取 Access token* https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html*/public function getAccessToken(){$params = ['grant_type' => 'client_credential','appid'      => $this->appId,'secret'     => $this->appSecret];$url = "https://api.weixin.qq.com/cgi-bin/token?" . http_build_query($params);$data = self::httpGet($url);if ($data) {return empty($data['access_token']) ? null : $data['access_token'];} else {return null;}}/*** 获取 jsapi_ticket* https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62*/public function getJsapiTicket($access_token){$params = ['access_token' => $access_token,'type'         => 'jsapi',];$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?" . http_build_query($params);$data = self::httpGet($url);if ($data) {return empty($data['ticket']) ? null : $data['ticket'];} else {return null;}}private function httpGet($url){$response = Requests::get($url);if ($response->success) {return json_decode($response->body, true);} else {return null;}}
}

JSSDKCache.php

<?phpnamespace app\utils\weixin;use app\service\RedisService;/*** 自定义实现缓存: access_token、jsapi_ticket** Class JSSDKCache* @package app\utils\weixin*/
class JSSDKCache extends JSSDK
{public function getSignData($url){$jsapi_ticket = $this->getJsapiTicketFromCache();$data = $this->getSignPackage($jsapi_ticket, $url);return $data;}public function getAccessTokenFromCache(){$cache_key = 'access_token.' . $this->appId;$access_token = RedisService::get($cache_key);if (!$access_token) {// 获取access_token$access_token = $this->getAccessToken();// 7200RedisService::set($cache_key, $access_token, 7100);}return $access_token;}public function getJsapiTicketFromCache(){$cache_key = 'jsapi_ticket.' . $this->appId;$jsapi_ticket = RedisService::get($cache_key);if (!$jsapi_ticket) {// 获取access_token$access_token = $this->getAccessTokenFromCache();$jsapi_ticket = parent::getJsapiTicket($access_token);// 7200RedisService::set($cache_key, $jsapi_ticket, 7100);}return $jsapi_ticket;}
}
<?phpnamespace app\service;use Predis\Client;/*** 使用Redis 缓存** Class RedisService* @package app\service*/
class RedisService
{// 可能有多个网站,每个网站给一个前缀private static $prefix = 'www';public static function getClient(){$client = new Client();return $client;}public static function getKey($key){return self::$prefix . '.' . $key;}public static function get($key){$client = self::getClient();$key    = self::getKey($key);return $client->get($key);}public static function set($key, $value, $expire = null){//https://learnku.com/laravel/t/3563/using-predis-to-operate-the-redis-database-how-to-set-the-key-life-cycle-expires$client = self::getClient();$key    = self::getKey($key);if ($expire) {// SET key value [EX seconds] [PX milliseconds] [NX|XX]$client->set($key, $value, 'EX', $expire);} else {$client->set($key, $value);}}}

WeixinService.php

<?phpnamespace app\service;use app\utils\weixin\JSSDKCache;class WeixinService
{// 公众号 开发者IDprivate static $APP_ID = '';// 开发者密码(AppSecret)private static $APP_SECRET = '';public static function getWeixinConfig($url){$jssdk = new JSSDKCache(self::$APP_ID, self::$APP_SECRET);return $jssdk->getSignData($url);}
}

WeixinController.php

<?phpnamespace app\api\controller;use app\BaseController;use app\service\WeixinService;class WeixinController extends BaseController
{public function getWeixinConfig(){$url = input('url');return WeixinService::getWeixinConfig($url);}
}

3、前端代码weixin-share.html

方式一:后端渲染

<!--微信分享-->
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script><script>wx.config({debug: false, // 开启调试模式appId: '{$appId}', // 必填,公众号的唯一标识timestamp: '{$timestamp}', // 必填,生成签名的时间戳nonceStr: '{$nonceStr}', // 必填,生成签名的随机串signature: '{$signature}',// 必填,签名// 必填,需要使用的JS接口列表jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData'], // 可选,获取开放标签权限openTagList: ['wx-open-launch-app'] });// 自定义“分享给朋友”及“分享到QQ”按钮的分享内容wx.ready(function () {   //需在用户可能点击分享按钮前就先调用wx.updateAppMessageShareData({title: '{$title}', // 分享标题desc: '{$summary}', // 分享描述link: '{$url}', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: "{$cover_icon}", // 分享图标success: function () {// 设置成功}});// 分享到朋友圈wx.updateTimelineShareData({title: '{$title}', // 分享标题link: '{$url}', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: "{$cover_icon}", // 分享图标success: function () {// 设置成功}})});wx.error(function(res){// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。console.log("config验证失败")});
</script>

方式二:前端通过接口获取

<!-- Axios -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script><!--微信分享-->
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script><script>url = window.location.href.split('#')[0];axios.post('/api/getWeixinConfig', {url: url}).then(res=>{let data = res.data.data;wx.config({debug: false, // 开启调试模式appId: data.appId, // 必填,公众号的唯一标识timestamp: data.timestamp, // 必填,生成签名的时间戳nonceStr: data.nonceStr, // 必填,生成签名的随机串signature: data.signature,// 必填,签名// 必填,需要使用的JS接口列表jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData'],// 可选,获取开放标签权限// openTagList: ['wx-open-launch-app']});// 自定义“分享给朋友”及“分享到QQ”按钮的分享内容wx.ready(function () {   //需在用户可能点击分享按钮前就先调用wx.updateAppMessageShareData({title: '{{ detail.title }}', // 分享标题desc: '{{ detail.summary }}', // 分享描述link: data.url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: '{{ detail.head_image }}', // 分享图标success: function () {// 设置成功}});// 分享到朋友圈wx.updateTimelineShareData({title: '{{ detail.title }}', // 分享标题link: data.url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致imgUrl: '{{ detail.head_image }}', // 分享图标success: function () {// 设置成功}})});wx.error(function(res){// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。console.log("config验证失败")});})</script>

微信分享:后端参数获取PHP实现相关推荐

  1. 微信分享后端接口简单实现

    微信分享后台接口简单实现 此接口大致的流程是:用户创建时间戳,随机字符串,当前需要分享的页面的url三个变量,接着将自己的appid和APPsecret作为请求参数获取access_token,再根据 ...

  2. Http请求头的Content-Type的几种格式和对应的后端参数获取

    今天在前后端联调开发过程中,出现了一个后端通过request.getParameterMap()方法获取不到请求参数的问题,所以在此做一个记录,并提出解决方案. 首先,出现问题是因为数据格式为Requ ...

  3. java,获取微信分享需要的获取 signature、jsapi_ticket和access_token

    废话不多,代码说话,那个url是你需要分享的url,需要传进来,然后入参加密. java,获取微信需要的获取 jsapi_ticket和access_token @Slf4j @Service pub ...

  4. 微信分享和微信H5跳转到APP开放标签wx-open-launch-app使用及样式设置

    H5.微信.App唤端相关 一.微信分享 二.浏览器H5跳转到APP 三.微信H5跳转到APP 一.条件说明 二.文档 三.重要的设置 四.注意点 五.样式设置 一.微信分享 参看:微信分享:后端参数 ...

  5. 微信小程序(三)自定义分享按钮和原生分享区分不同按钮的分享带参数分享和获取

    大家有不会的可以进群交流 官方的分享 点击右上角的三个点 /*** 用户点击右上角分享*/onShareAppMessage: function(ops) {wx.showShareMenu({wit ...

  6. PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法,php/thinkphp实现微信分享自定义文字和图片...

    PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法, php/thinkphp实现微信分享自定义文字和图片. 一.先看微信JS-SDK文 ...

  7. React / Vue 前后端分离项目实现微信分享教程

    小编推荐:Fundebug专注于JavaScript.微信小程序.微信小游戏,Node.js和Java实时BUG监控.真的是一个很好用的bug监控费服务,众多大佬公司都在使用. 网上非常多的微信分享例 ...

  8. 使用javascript获取wx.config内部字段解决微信分享

    背景 在微信分享开发的时候我们通常的流程是 <?phprequire_once "jssdk.php";$jssdk = new JSSDK("yourAppID& ...

  9. javascript获取wx.config内部字段解决微信分享

    转自:http://www.jb51.net/article/80679.htm 背景 在微信分享开发的时候我们通常的流程是 <?php require_once "jssdk.php ...

最新文章

  1. WIN2008系统的IIS7.0配置REWRITE伪静态环境
  2. html Qestionnaire表单
  3. 我也学习JAVA多线程-join
  4. Chrome开发者工具使用console.trace的一个小技巧
  5. 工业级以太网交换机产品特征及应用案例介绍
  6. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(5) - 控制转移指令
  7. Spring源码解析(五)——自定义标签解析
  8. Java设计模式-简单工厂模式(Static Factory Method)
  9. MVC3开发常常遇到的问题及常常使用到的代码片段
  10. 分析方法选讲期末复习脉络图---完结版
  11. 在java中gc是啥_java中,什么是GC?GC的基本原理。
  12. 基于安卓Android平台的数独游戏的开发
  13. JavaScript实现Sleep效果
  14. 乐得瑞LDR6282B 支持双C口盲插便携显示器驱动板方案
  15. 新上线APP如何推广提升排名
  16. What does assigning ‘shift‘ to a variable mean?
  17. 中国极地考察船“雪龙”号前往南极中山站
  18. 为什么要早点进入IT行业?
  19. 下列哪项不是python中对文件的读取操作-Python—文件读写操作
  20. Python中graphics不存在,解决办法

热门文章

  1. .NET基础笔记(C#)
  2. 前端复习8:JS高级
  3. 使用CSS 中伪元素:before 和:after 做简单的动画(以小米商城非首页 logo 动画为例)
  4. 与“三节课”一同寻找“可能不存在的”规律
  5. 【论文笔记】:PP-YOLO、PP-YOLOv2、PP-YOLO Tiny
  6. uniCloud 云函数操作云数据库
  7. 博弈论(一)--yale
  8. 哪些测试中的逆向思维
  9. 浅谈大数据业务处理流程
  10. 安卓自定义View进阶-事件分发机制原理【转自 app架构师 微信公众号】