温州潘坑乡php实现微信sdk分享接口
阅读 30801 · 发布日期 2020-08-24 17:26 · 温州优光网络科技有限公司|建站|APP小程序制作|做网站SEO推广优化
【摘要】
软件开发工具包(外语首字母缩写:SDK、外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。本文主要和大家分享php实现微信sdk分享接口,希望能帮助到大家。 【温州小程序开发,温州微信公众号,平阳做网站,平阳网站建设公司,平阳小程序商城制作,昆阳万全做网站,鳌江水头小程序,萧江腾蛟微信公众号,山门顺溪南雁海西南麂凤卧麻步怀溪网络网店服务,政采云网店管理服务】...
软件开发工具包(外语首字母缩写:SDK、外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
本文主要和大家分享php实现微信sdk分享接口,希望能帮助到大家。
private $appId;
private $appSecret;
/* * 这里为威狮码的公众号的openid和appsecret,如果配置到其他的子商家会出现需要关注威狮码公众号, * 则需要获取数据库的vender表里面的openid和appsecret * */ public function __construct($appId = '
自己的appid'
, $appSecret = '
自己的appSecret'
) {
$this->appId = $appId;
$this->appSecret = $appSecret;
}
public function getSignPackage(Request $request) {
//接收到前端的转义url转义回来 $url = $_POST;
$durl = $url['
url'
];
$durl = urldecode($durl);
$jsapiTicket = $this->getJsApiTicket();
$timestamp = time();
$nonceStr = $this->createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$durl";
$signature = sha1($string);
$signPackage = [ "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ];
// var_dump($signPackage);
die;
throw new SuccessMessage(['
msg'
=> $signPackage]);
}
private function createNonceStr($length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0;
$i $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
private function getJsApiTicket() {
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jssdk/jsapi_ticket.json"));
if ($data->expire_time $accessToken = $this->getAccessToken();
//定义传递的参数数组 $params['
type'
] = '
jsapi'
;
$params['
access_token'
] = $accessToken;
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $params['
access_token'
] . "&type=" . $params['
type'
] . "";
$res = json_decode(curl_get($url, $params));
$ticket = isset($res->ticket) ? $res->ticket : NULL;
if ($ticket) {
$res->expire_time = time() + 7000;
$res->jsapi_ticket = $ticket;
$fp = fopen("jssdk/jsapi_ticket.json", "w");
fwrite($fp, json_encode($res));
fclose($fp);
}
}
else {
$ticket = $data->jsapi_ticket;
}
return $ticket;
}
private function getAccessToken() {
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jssdk/access_token.json"));
if ($data->expire_time //定义传递的参数数组 $params['
grant_type'
] = '
client_credential'
;
$params['
appid'
] = $this->appId;
$params['
secret'
] = $this->appSecret;
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" . $params['
grant_type'
] . "&appid=" . $params['
appid'
] . "&secret=" . $params['
secret'
] . "";
$res = json_decode(curl_post($url, $params));
$access_token = isset($res->access_token) ? $res->access_token : NULL;
if ($access_token) {
$res->expire_time = time() + 7000;
$res->access_token = $access_token;
$fp = fopen("jssdk/access_token.json", "w");
fwrite($fp, json_encode($res));
fclose($fp);
}
}
else {
$access_token = $data->access_token;
}
return $access_token;
}
前端代码核对官方步骤,确认签名算法。
确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
确认url是页面完整的url(请在当前页面alert(location.href.split('
#'
)[0])确认),包括'
http(s)://'
部分,以及'
?'
后面的GET参数部分,但不包括'
#'
hash后面的部分。
确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
确保一定缓存access_token和jsapi_ticket。
确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。
如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'
#'
hash部分的链接(可用location.href.split('
#'
)[0]获取,而且需要encodeURIComponent,后台decodeURIComponent解码),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
签名是正确,上面的步骤还没能解决你的问题(invalid signature)那就用是url的问题,注意:
微信公众号必须配置了你调试的安全域名(可以配置二级域名:
xxx.com,而不用配置多个a.xxx.com/b.xxx.com等)。
原因:
微信分享时候会给你当前页面添加多个参数,你sha1时候必须保证url地址是微信给你加了参数之后的地址,这样才不会报config:
invalid signature.解决方案:
sha1之前url必须是解码之后的正常的肉眼直接能识别的url,如果你用的是静态页面,在你配置wx.config之前,先通过encodeURIComponent(location.href.split('
#'
)[0])把当前url编码传递到后台,后台通过decodeURIComponent解码,核心代码如下:
前台html页面,编码传递url:
jQuery.post("/xxx", {
"url": encodeURIComponent(window.location.href.split('
#'
)[0]),"t": new Date().getTime()}
, function (result) {
if (result.errno != 0) {
alert("您当前的网络不稳定请稍后再试!");
return;
}
var shareUrl = result.data.url;
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '
xxx'
, // 必填,公众号的唯一标识 timestamp: result.data.timestamp, // 必填,生成签名的时间戳 nonceStr: result.data.nonceStr, // 必填,生成签名的随机串 signature: result.data.signature,// 必填,签名,见附录1 jsApiList: ['
onMenuShareAppMessage'
,'
onMenuShareTimeline'
,'
onMenuShareQQ'
,'
onMenuShareWeibo'
,'
onMenuShareQZone'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }
);
以上就是php实现微信sdk分享接口的详细内容,更多请关注php中文网其它相关文章!
微信
分享相关标签:
php 接口 分享本文原创发布php中文网,转载请注明出处,感谢您的尊重!
上一篇:
微信扫码支付的Asp.Net MVC开发
下一篇:
微信如何获取openid相关文章相关视频修改微信号有什么影响吗?微信中共享实时位置什么意思数据库设计的基本原则是什么?微信小程序调用图片安全APIphp实现微信sdk分享接口PHP开发基础教程之简介PHP新手入门之简介PHP开发基础教程之环境搭建php学习路线介绍php环境配置 [温州做微信公众号]