一个PHP文件实现JS-SDK新版微信分享朋友圈,分享给好友功能

前言

如今网上不少关于js-sdk的文章,一搜处处都是,而且有不少不一样的实现方法,解决方案,可是均已失效,由于之前的1.0版、1.4版接口都已经丢弃了。javascript

如今已经进入1.6版接口,咱们除了要引用jweixin-1.6.0.js以外,还要使用最新的API。php

以前的版本是有分享成功、取消分享、分享失败的回调函数的,如今为了防止这个接口的滥用,已经取消了回调,没法检测是否已经分享成功了。html

新版的分享朋友圈、分享给好友的API是:前端

'updateAppMessageShareData', //分享到朋友圈
'updateTimelineShareData',//分享给朋友

实现流程

一、先经过后端获取几个参数:jsapi_ticket、noncestr、timestamp、url,获取这几个参数的目的就是为了签名得到signature。
二、前端要引入官方的1.6版js文件jweixin-1.6.0.jsjava

http://res.wx.qq.com/open/js/jweixin-1.6.0.js

三、前端初始化配置,即将后端获取到的参数都用到前端上去,而且在jsApiList这个数组当中添加你要使用的API。json

// 初始化配置
 wx.config({
    debug: true, // 正式上线后成false不在弹出调试信息
    appId: '<?php echo $appid;?>',
    timestamp: '<?php echo $timestamp;?>',
    nonceStr: '<?php echo $nonceStr;?>',
    signature: '<?php echo $signature;?>',
    jsApiList: [
      // 全部要调用的 API 都要加到这个列表中
      'updateAppMessageShareData', //分享到朋友圈
      'updateTimelineShareData',//分享给朋友
    ]
  });

四、而后调用ready函数来验证是否配置成功后端

wx.ready(function () {
    //实例化API
    }
})

信息验证失败会执行error函数,如签名过时致使验证失败,具体错误信息能够打开config的debug模式查看,也能够在返回的res参数中查看。api

wx.error(function(res){    
    // config    
    alert(res);
});

五、实例化API数组

//分享到朋友圈
wx.updateTimelineShareData({
    title: '', // 分享标题
    link: '', // 分享连接,该连接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl: '', // 分享图标
    success: function (res) {
        //分享成功
    }
})

wx.updateAppMessageShareData({ 
    title: '', // 分享标题
    desc: '', // 分享描述
    link: '', // 分享连接,该连接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl: '', // 分享图标
    success: function (res) {
      //分享成功
    }
})

代码

<?php
// 声明页面header
header("Content-type:charset=utf-8");

// 声明APPID、APPSECRET
$appid = "填写你的APPID";
$appsecret = "填写你的APPSECRET";

// 获取access_token和jsapi_ticket
function getToken(){
   $file = file_get_contents("access_token.json",true);//读取access_token.json里面的数据
   $result = json_decode($file,true);

//判断access_token是否在有效期内,若是在有效期则获取缓存的access_token
//若是过时了则请求接口生成新的access_token而且缓存access_token.json
if (time() > $result['expires']){
       $data = array();
       $data['access_token'] = getNewToken();
       $data['expires'] = time()+7000;
       $jsonStr =  json_encode($data);
       $fp = fopen("access_token.json", "w");
       fwrite($fp, $jsonStr);
       fclose($fp);
       return $data['access_token'];
   }else{
       return $result['access_token'];
   }
}

//获取新的access_token
function getNewToken($appid,$appsecret){
   global $appid;
   global $appsecret;
   $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret."";
   $access_token_Arr =  file_get_contents($url);
   $token_jsonarr = json_decode($access_token_Arr, true);
   return $token_jsonarr["access_token"];
}

$access_token = getToken();

//缓存jsapi_ticket
function getTicket(){
   $file = file_get_contents("jsapi_ticket.json",true);//读取jsapi_ticket.json里面的数据
   $result = json_decode($file,true);

//判断jsapi_ticket是否在有效期内,若是在有效期则获取缓存的jsapi_ticket
//若是过时了则请求接口生成新的jsapi_ticket而且缓存jsapi_ticket.json
if (time() > $result['expires']){
       $data = array();
       $data['jsapi_ticket'] = getNewTicket();
       $data['expires'] = time()+7000;
       $jsonStr =  json_encode($data);
       $fp = fopen("jsapi_ticket.json", "w");
       fwrite($fp, $jsonStr);
       fclose($fp);
       return $data['jsapi_ticket'];
   }else{
       return $result['jsapi_ticket'];
   }
}

//获取新的access_token
function getNewTicket($appid,$appsecret){
   global $appid;
   global $appsecret;
   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=".getToken()."";
   $jsapi_ticket_Arr =  file_get_contents($url);
   $ticket_jsonarr = json_decode($jsapi_ticket_Arr, true);
   return $ticket_jsonarr["ticket"];
}

$jsapiTicket = getTicket();

// 动态获取URL
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

// 生成时间戳
$timestamp = time();

// 生成nonceStr
$createNonceStr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
str_shuffle($createNonceStr);
$nonceStr = substr(str_shuffle($createNonceStr),0,16);

// 按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

// 按顺序排列按sha1加密生成字符串
$signature = sha1($string);

?>
<!DOCTYPE html>
<html lang="zh_cn">
   <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
       <title>要分享的index模板页面</title>  

   </head>
   <body>
       <h3>已得到updateAppMessageShareData</h3>
       <h3>已得到updateTimelineShareData</h3>
       <h3>这两个API权限</h3>
       <h3>请点击右上角[···]体验</h3>
   </body>
</html>
   <!-- 引入微信分享js-->
   <script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
   <script type="text/javascript">
    // 初始化配置
    wx.config({
       debug: true, // 正式上线后改为false不在弹出调试信息
       appId: '<?php echo $appid;?>',
       timestamp: '<?php echo $timestamp;?>',
       nonceStr: '<?php echo $nonceStr;?>',
       signature: '<?php echo $signature;?>',
       jsApiList: [
         // 全部要调用的 API 都要加到这个列表中
         'updateAppMessageShareData', //分享到朋友圈
         'updateTimelineShareData',//分享给朋友
       ]
     });

    // 配置完成后会调用ready函数
    wx.ready(function (res) {

     //分享到朋友圈
     wx.updateTimelineShareData({
       title: '调用成功!分享到朋友圈!', // 分享标题
       link: 'http://www.liketube.cn/res/share.php', // 分享连接,该连接域名或路径必须与当前页面对应的公众号JS安全域名一致
       imgUrl: 'http://www.liketube.cn/res/1.jpg', // 分享图标
       success: function (res) {
         // 分享成功
       }
     })

     wx.updateAppMessageShareData({ 
       title: '调用成功!分享给好友!', // 分享标题
       desc: '微信JSSDK1.6新版分享接口成功调用!', // 分享描述
       link: 'http://www.liketube.cn/res/share.php', // 分享连接,该连接域名或路径必须与当前页面对应的公众号JS安全域名一致
       imgUrl: 'http://www.liketube.cn/res/1.jpg', // 分享图标
       success: function (res) {
         // 分享成功
       }
     })

   });

   //错误返回信息
   wx.error(function(res){    
   // config信息验证失败会执行error函数,如签名过时致使验证失败,具体错误信息能够打开config的debug模式查看,也能够在返回的res参数中查看,对于SPA能够在这里更新签名。    
       alert(res);
   });    
   
</script>

代码说明

一、在使用这个代码以前,请把您的域名添加到已认证的公众号的JS安全域名当中,具体到文件夹,例如你的程序代码在page文件夹,那么JS安全域名为www.xxx.com/page缓存

二、wx.config,debug: true打开能够看到调试信息,若是返回config:ok则表明成功。若是返回其余的,请在开发者工具根据错误码进行调试。看下图,三连弹。

微信图片_20200215224847.jpg

意思是咱们的配置信息OK、分享朋友圈API也OK、分享给好友API也OK。

这是在开发的时候应该开启的dubug,若是都OK,到时候上线使用,直接debug: false就不会弹出来了!

三、由于涉及到生成access_token和jsapi_ticket,而且这两个东西天天请求量有限,而且这两个东西有效期为2小时,因此这两个东西我都是缓存到服务器的,因此会在服务器生成access_token.json、jsapi_ticket.json这两个文件,每次访问页面,都会访问这两个文件,判断是否超时,若是超时,则从新获取而且缓存,若是还没超时,那就直接调用缓存。

分享朋友圈

微信图片_20200215225333.jpg

分享给好友

微信图片_20200215225404.jpg

体验一把

微信截图_20200215225537.png

做者

Author:TANKING
Date:2020-2-15
Web:www.likeyunba.comWeChat:face6009

相关文章
相关标签/搜索