1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 微信实现自定义分享功能

微信实现自定义分享功能

时间:2020-08-28 04:38:30

相关推荐

微信实现自定义分享功能

今天小编写微信分享接口。上网查了下,代码很多,但都不是很全!所以,小编特地真理了下.....

0、效果

1、有一个认证过的微信公众号。

2、把你要分享的网站IP地址加入微信白名单。

需要把网站域名加入js接口 目的是为了能调用微信的js

3、获取AppIDAppSecret 俩个参数

4、后台接口写法:

使用TP 框架的写法:

public function wx_get_token() {

$token = S('access_token');

if (!$token) {

$appid='XXXXX'; // 你自己的微信appid

$appsecret='XXXXXX'; //你自己的微信appsecret

$res = file_get_contents('https://api./cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret);

$res = json_decode($res, true);

$token = $res['access_token'];

// 注意:这里需要将获取到的token缓存起来(或写到数据库中)

// 不能频繁的访问https://api./cgi-bin/token,每日有次数限制

// 通过此接口返回的token的有效期目前为2小时。令牌失效后,JS-SDK也就不能用了。

// 因此,这里将token值缓存1小时,比2小时小。缓存失效后,再从接口获取新的token,这样

// 就可以避免token失效。

// S()是ThinkPhp的缓存函数,如果使用的是不ThinkPhp框架,可以使用你的缓存函数,或使用数据库来保存。

S('access_token', $token, 3600);

}

return $token;

}

//获取ticket

function wx_get_jsapi_ticket(){

$ticket = "";

do{

$ticket = S('wx_ticket');

if (!empty($ticket)) {

break;

}

$token = S('access_token');

if (empty($token)){

$this->wx_get_token();

}

$token = S('access_token');

if (empty($token)) {

//logErr("get access token error.");

break;

}

$url2 = sprintf("https://api./cgi-bin/ticket/getticket?access_token=%s&type=jsapi",

$token);

$res = file_get_contents($url2);

$res = json_decode($res, true);

$ticket = $res['ticket'];

// 注意:这里需要将获取到的ticket缓存起来(或写到数据库中)

// ticket和token一样,不能频繁的访问接口来获取,在每次获取后,我们把它保存起来。

S('wx_ticket', $ticket, 3600);

}while(0);

return $ticket;

}

//获取16位随机编码

function getRandCode( $length = 16 ) {

$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

$tmpstr ='';

for ( $i = 0; $i < $length; $i++ )

{

// 这里提供两种字符获取方式

// 第一种是使用 substr 截取$chars中的任意一位字符;

// 第二种是取字符数组 $chars 的任意元素

// $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);

$tmpstr .= $chars[ mt_rand(0, strlen($chars) - 1) ];

}

return $tmpstr;

}

public function index(){

$ticket = $this-> wx_get_jsapi_ticket();

$timestamp =time();

$nonceStr = $this->getRandCode();

$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // url 最好是动态获取

//按照微信的要求排序拼接组合

$signature = sprintf("jsapi_ticket=%s&noncestr=%s&timestamp=%s&url=%s",$ticket, $nonceStr, $timestamp, $url);

// echo $signature."<br />";

$signature= sha1($signature); //$signature 这就是微信签名

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

$this->assign('noncestr',$nonceStr);

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

$this->display('Bqqy/index');

}

5、前台的 html 页面

第2步加入js接口 目的就是这个 :引入微信js <script src="http://res./open/js/jweixin-1.2.0.js"> </script>

<script>

wx.config({

debug: false, // 调试的bug的

appId: "XXXXX",

timestamp: '{$timestamp}',

nonceStr: '{$noncestr}',

signature: '{$signature}',

jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] // 功能列表,我们要使用JS-SDK的什么功能

});

wx.ready(function(){

// 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口

wx.onMenuShareTimeline({

title: 'XXXXX ', // 分享标题

link: "XXXXX", //分享的url,以http或https开头

imgUrl: "XXXXX",// 分享图标

});

// 获取“分享给朋友”按钮点击状态及自定义分享内容接口

wx.onMenuShareAppMessage({

title: 'XXXXX ', // 分享标题

desc: "XXXXX ", // 分享描述

link: "XXXXX", //分享的url,以http或https开头

imgUrl: "XXXXX",// 分享图标

type: 'link', // 分享类型,music、video或link,不填默认为link

});

});

wx.error(function (res) {

alert(res.errMsg);//错误提示

});

</script>

6、一些错误的检查、修改

如何提示 :invalid signature // 签名失效

(1)确认签名算法正确,可用 http://mp./debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。

(2)确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。

(3)确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。

(4)确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。

(5)确保一定缓存access_token和jsapi_ticket。

(6)确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。

7、再有错误,具体在细说了......

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。