微信朋友圈后台设计前端怎么做

&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!微信JSAPI 微信内置JSAPI 2015年1月官方正式API接口,分享完整实例 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 17时,
微信JSAPI&微信内置JSAPI&2015年1月官方正式API接口,分享完整实例日,今天发现一些JS分享问题,一直很费解,通过查看原版开发手册,发现了根据原版的JSSDK进行修改补充。主要用于微信浏览器分享朋友圈,转发好友等功能。碎片赚钱哪家强,快来微信找微饷。关注《微饷》微信公众账号。QQ:
代码片段(3)
1.&[代码]HTML通过微信,分享朋友圈出发此JSAPI&&&&
require_once "jssdk.php";
$jssdk = new JSSDK("yourAppID", "yourAppSecret");
$signPackage = $jssdk-&GetSignPackage();
&!DOCTYPE html&
&html lang="en"&
&meta charset="UTF-8"&
&title&&/title&
&script src="http://res./open/js/jweixin-1.0.0.js"&&/script&
// 注意:所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
// 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
// 完整 JS-SDK 文档地址:http://mp./wiki/7/aaa137b55fb2e48dd613f.html
wx.config({
appId: '&?php echo $signPackage["appId"];?&',
timestamp: &?php echo $signPackage["timestamp"];?&,
nonceStr: '&?php echo $signPackage["nonceStr"];?&',
signature: '&?php echo $signPackage["signature"];?&',
jsApiList: [
// 所有要调用的 API 都要加到这个列表中
wx.ready(function () {
// 在这里调用 API
wx.onMenuShareTimeline({
title: '', // 分享标题
link: '', // 分享链接
imgUrl: '', // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
wx.onMenuShareAppMessage({
title: '', // 分享标题
desc: '', // 分享描述
link: '', // 分享链接
imgUrl: '', // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
wx.onMenuShareQQ({
title: '', // 分享标题
desc: '', // 分享描述
link: '', // 分享链接
imgUrl: '', // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
wx.onMenuShareWeibo({
title: '', // 分享标题
desc: '', // 分享描述
link: '', // 分享链接
imgUrl: '', // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
2.&[代码]微信公众平台多用户分享JSSDK&&&&
class JSSDK {
private $appId;
private $appS
public $User_ID;
public function __construct($appId, $appSecret, $User_ID = 1) {
$this-&appId = $appId;
$this-&appSecret = $appS
$this-&User_ID = $User_ID;
public function Ext_FileSystem(){
if(!file_exists("jSon_file/jsapi_ticket_".$this-&User_ID.".json")){
touch("jSon_file/jsapi_ticket_".$this-&User_ID.".json");
chmod("jSon_file/jsapi_ticket_".$this-&User_ID.".json",0755);
if(!file_exists("jSon_file/access_token_".$this-&User_ID.".json")){
touch("jSon_file/access_token_".$this-&User_ID.".json");
chmod("jSon_file/access_token_".$this-&User_ID.".json",0755);
public function getSignPackage() {
$this-&Ext_FileSystem();
$jsapiTicket = $this-&getJsApiTicket();
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp = time();
$nonceStr = $this-&createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
=& $this-&appId,
"nonceStr"
=& $nonceStr,
"timestamp" =& $timestamp,
"signature" =& $signature,
"rawString" =& $string
return $signP
private function createNonceStr($length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str = "";
for ($i = 0; $i & $ $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
private function getJsApiTicket() {
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(file_get_contents("jSon_file/jsapi_ticket_".$this-&User_ID.".json"));
if ($data-&expire_time & time()) {
$accessToken = $this-&getAccessToken();
$url = "https://api./cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode($this-&httpGet($url));
$ticket = $res-&
if ($ticket) {
$data-&expire_time = time() + 7000;
$data-&jsapi_ticket = $
$fp = fopen("jSon_file/jsapi_ticket_".$this-&User_ID.".json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
chmod("jSon_file/jsapi_ticket_".$this-&User_ID.".json",0777);
$ticket = $data-&jsapi_
private function getAccessToken() {
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(file_get_contents("jSon_file/access_token_".$this-&User_ID.".json"));
if ($data-&expire_time & time()) {
$url = "https://api./cgi-bin/token?grant_type=client_credential&appid=$this-&appId&secret=$this-&appSecret";
$res = json_decode($this-&httpGet($url));
$access_token = $res-&access_
if ($access_token) {
$data-&expire_time = time() + 7000;
$data-&access_token = $access_
$fp = fopen("jSon_file/access_token_".$this-&User_ID.".json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
chmod("jSon_file/access_token_".$this-&User_ID.".json",0777);
$access_token = $data-&access_
return $access_
private function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
3.&[代码]微信后台加密与算法&&&&
class JSSDK {
private $appId;
private $appS
public function __construct($appId, $appSecret) {
$this-&appId = $appId;
$this-&appSecret = $appS
public function getSignPackage() {
$jsapiTicket = $this-&getJsApiTicket();
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp = time();
$nonceStr = $this-&createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
=& $this-&appId,
"nonceStr"
=& $nonceStr,
"timestamp" =& $timestamp,
"signature" =& $signature,
"rawString" =& $string
return $signP
private function createNonceStr($length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str = "";
for ($i = 0; $i & $ $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
private function getJsApiTicket() {
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(file_get_contents("jsapi_ticket.json"));
if ($data-&expire_time & time()) {
$accessToken = $this-&getAccessToken();
$url = "https://api./cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode($this-&httpGet($url));
$ticket = $res-&
if ($ticket) {
$data-&expire_time = time() + 7000;
$data-&jsapi_ticket = $
$fp = fopen("jsapi_ticket.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
$ticket = $data-&jsapi_
private function getAccessToken() {
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(file_get_contents("access_token.json"));
if ($data-&expire_time & time()) {
$url = "https://api./cgi-bin/token?grant_type=client_credential&appid=$this-&appId&secret=$this-&appSecret";
$res = json_decode($this-&httpGet($url));
$access_token = $res-&access_
if ($access_token) {
$data-&expire_time = time() + 7000;
$data-&access_token = $access_
$fp = fopen("access_token.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
$access_token = $data-&access_
return $access_
private function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
开源中国-程序员在线工具:
相关的代码(855)
2楼:刘振东 发表于
3楼:vancoud 发表于
4楼:少红领巾 发表于
5楼:少红领巾 发表于
6楼:ZHXI 发表于
怎么感觉和官方的差别不大??
7楼:主编 发表于
sdk有一处错误,就没发现吗?竟然直接原文复制。。。。
8楼:dqzhangp 发表于
只能在微信内开发使用?
9楼:renzf 发表于
引用来自“主编”的评论sdk有一处错误,就没发现吗?竟然直接原文复制。。。。哦~~~ 求暴料,求分享。
10楼:主编 发表于
引用来自“主编”的评论sdk有一处错误,就没发现吗?竟然直接原文复制。。。。引用来自“renzf”的评论哦~~~ 求暴料,求分享。很简单,你跑下上面代码就知道问题了。第47行中type不应为jssdk而是jsapi,这是微信官方的一处错误,而他没做测试就复制出来
11楼:youkuiyuan 发表于
引用来自“主编”的评论sdk有一处错误,就没发现吗?竟然直接原文复制。。。。引用来自“renzf”的评论哦~~~ 求暴料,求分享。引用来自“主编”的评论很简单,你跑下上面代码就知道问题了。第47行中type不应为jssdk而是jsapi,这是微信官方的一处错误,而他没做测试就复制出来谢谢您的问题,这个文档主要的目的在于微信分享功能的写法与使用。里面的PHP是直接放上去的作为一个查看,真实情况再用的时候自己查看,有的需要有的不需要,最主要是为了上面的JS分享。这个是我做这个文章的初衷。谢谢您
12楼:youkuiyuan 发表于
引用来自“dqzhangp”的评论只能在微信内开发使用?是的,听说可以在QQ浏览起里面使用。最新版的浏览器。同时想要在微信使用,android版微信必须更新到最新版
13楼:南流-Jimmy 发表于
微信分享给朋友后,回调中能知道是分享给 【哪个朋友】了么?
14楼:Eswl 发表于
关闭窗口的方法 &有没有详细的解释,微信开发群:
开源从代码分享开始
youkuiyuan的其它代码现在越来越多的人喜欢分享一些东西给微信好友,所以我们最近需求要自定义分享微信内容,上网找了些资料,终于搞定了,下面来分享些经验。
·&&&&&&&1.需要自定义分享的设置,需要绑定一个微信公众号。首先要在公众号的设置-功能设置里设置JS安全域名,这样微信会检查被分享的链接是否在安全域名内,不在的话,将无法自定义分享。
·&&&&&&&2. 在开发者中心中获取你的AppID和AppSecret,接下来在获取令牌时,需要这两个信息。
·&&&&&&&3.微信这里做了很多的安全验证,所以这里先需要后台做些准备工作:(后面会有详细的代码)
a.需要凭借你的appId和appSecret向腾讯申请access_token,token相当于令牌,说白了就是腾讯认定你是微信公众号的开发者,可以让你用一些腾讯的开发功能;
拿到token后要将token缓存起来或者存入数据库中,每个token有效时间为2小时,如果请求成功了新的token,之前的就作废掉了。
返回成功示例:
{&access_token&:&vdlThyTfyB0N5eMoi3n_aMFMKPuwkE0MgyGf_0h0fpzL8p_hsdUX8VGxz5oSXuq5dM69lxP9wBwN9Yzg-0kVHY33BykRC0YXZZZ-WdxEic4&,&expires_in&:7200}
·&&&&&&&b.获取jsapi的ticket。jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。也就是说,腾讯这么多开发功能你想使用微信的jsapi,凭借着之前的门票,在给你另一张新的门票,这个门票专门来开发微信的jsapi。
拿到ticket之后,也要缓存起来或者存入数据库中,因为他跟token失效机制是一样的。
返回成功实例:
{&errcode&:0,&errmsg&:&ok&,&ticket&:&sM4AOVdWfPE4DxkXGEs8VMKv7FMCPm-I98-klC6SO3Q3AwzxqljYWtzTCxIH9hDOXZCo9cgfHI6kwbe_YWtOQg&,&expires_in&:7200}
·&&&&&&&c.要获得一个签名。
此处要将jsapi_ticket、noncestr、timestamp、分享的url按字母顺序连接起来,进行sha1签名。 noncestr是你设置的任意字符串。 timestamp为10位秒级别的时间戳。
然后,后台要做的到此结束。
后台还要将noncestr,timestamp,appId和signature传给前台
&//获取token
function wx_get_token() {
$token = S('access_token');
if (!$token) {
$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);
//获取ticket
function wx_get_jsapi_ticket(){
$ticket = &&;
$ticket = S('wx_ticket');
if (!empty($ticket)) {
$token = S('access_token');
if (empty($token)){
wx_get_token();
$token = S('access_token');
if (empty($token)) {
logErr(&get access token error.&);
$url2 = sprintf(&https://api./cgi-bin/ticket/getticket?access_token=%s&type=jsapi&,
$res = file_get_contents($url2);
$res = json_decode($res, true);
$ticket = $res['ticket'];
// 注意:这里需要将获取到的ticket缓存起来(或写到数据库中)
// ticket和token一样,不能频繁的访问接口来获取,在每次获取后,我们把它保存起来。
S('wx_ticket', $ticket, 3600);
}while(0);
* sha1加密, 返回给前端使用
public function signature($timestamp, $nonceStr, $url)
$ticket = $this-&getJsapiTicket();
$wxOri = sprintf(&jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s&,
$ticket, $nonceStr, $timestamp, $url
return sha1($wxOri);
·&&&&&&&前台的代码来了:
首先引入微信JS-SDK
&script type=&text/javascript& src=&http://res./open/js/jweixin-1.0.0.js&&&/script&
然后在页面配置
// 微信配置
wx.config({
debug: false,
appId: &你的AppID&,
timestamp: '上一步生成的时间戳',
nonceStr: '上一步中的字符串',
signature: '上一步生成的签名',
jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] // 功能列表,我们要使用JS-SDK的什么功能
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在 页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready 函数中。
wx.ready(function(){
// 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
wx.onMenuShareTimeline({
title: '分享标题', // 分享标题
link:&分享的url,以http或https开头&,
imgUrl: &分享图标的url,以http或https开头& // 分享图标
// 获取“分享给朋友”按钮点击状态及自定义分享内容接口
wx.onMenuShareAppMessage({
title: '分享标题', // 分享标题
desc: &分享描述&, // 分享描述
link:&分享的url,以http或https开头&,
imgUrl: &分享图标的url,以http或https开头&, // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
·&&&&&&&这里还有几个坑要说下,避免大家入坑:
JS安全域名一定要是一级域名,如qq.com,不带www的,二级域名是不行的,因为相比以前的分享没有任何域名限制,这里设置安全域名,目的是为了当发现此公众平台发现诱导分享行为时,可以根据此域名追溯到所有分享出去的链接,以及通过这些链接增加的粉丝。这样,微信就可以牢牢控制了你的微信平台,一旦发现违规,让分享链接失效,删除掉诱导行为增加的粉丝,是瞬间就可以完成的。因此,微信平台的开发者,一定要合理来使用分享功能,不要因小失大。等到你的微信平台被封,估计哭都来不及。
Token请求每天也是有上限的,每天请求最多2000次,超过了次数将无法在此请求,一旦超出,可以在公众号管理后台-开发-接口权限-获取access_token的操作哪里重置,不过每个月只有10此机会。
有一个网页调试工具,来查看token的,地址:
生成签名哪里的被分享的url地址一定要是动态获取的,之前我做的时候,静态地址就不可以。
网页调试工具,对比自己生成的签名对不对:
常见的报错:
config:invalid signature
签名错误,逐一检查生成签名的每一项,是否有错误;
config:invalid url domain
被分享的链接不再安全域名内,如果是开发完成测试的时候报的这个错误,放到线上一般就对了。
官方给的JS-SDK说明文档:
最后微信也提供了官方的开发者工具,界面仿照chrome做的,可以模拟手机端的一些操作,其实就是模拟分享过程和查看SDK的消息
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17447次
排名:千里之外
原创:35篇
(2)(2)(1)(1)(2)(2)(6)(1)(9)(9)(1)(1)}

我要回帖

更多关于 微信朋友圈广告后台 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信