先登录微信公众平台进入**“公众号设置”的“功能设置”里填写“JS接口安全域名”。**
备注:登录后可在“开发者中心”查看对应的接口权限。
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。
备注:支持使用 AMD/CMD 标准模块加载方法加载
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: ['updateAppMessageShareData','updateTimelineShareData'] // 必填,需要使用的JS接口列表
});
备注:以下参数需要后端开发提供接口返回给前端)
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
前端代码:
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.updateAppMessageShareData({
title: '{$info.good_name}', // 分享标题
desc: '{$info.good_sub_name}', // 分享描述
link: '{$wechatData.shareUrl}', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: '{$info["good_cover_img"]}', // 分享图标
success: function () {
// 设置成功
}
});
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
wx.updateTimelineShareData({
title: '{$info.good_name}', // 分享标题
link: '{$wechatData.shareUrl}', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: '{$info["good_cover_img"]}', // 分享图标
success: function () {
// 设置成功
}
})
});
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
后端参考代码:
<?php
namespace app\mall\service;
use think\Log;
use think\Cache;
use WeChatPay\Formatter;
use app\mall\service\WeChatPayService;
/**
* 微信其他接口
*/
class WeChatService
{
/**
* @var array|mixed
*/
private $config;
/**
* @var \WeChatPay\BuilderChainable
*/
private $instance;
private $merchantPrivateKeyInstance;
public function __construct($config = [])
{
$this->config = $config ? $config : config('WX_PAY');
}
// 获取 前端分享需要的数据
public function getData($url)
{
$timeStamp = (string)Formatter::timestamp();
$nonceStr = Formatter::nonce();
$data = [];
$data['noncestr'] = $nonceStr; // 生成签名的随机串
$data['jsapi_ticket'] = $this->getJsapiTicket();
$data['timestamp'] = $timeStamp; // 时间戳
$data['url'] = $url; //
$signature = $this->getSign($data);
$data['signature'] = $signature;
return $data;
}
//作用:生成签名
public function getSign($Obj) {
//去空
$Parameters = array_filter($Obj);
//签名步骤一:按字典序排序参数
ksort($Parameters);
$string = $this->formatBizQueryParaMap($Parameters, false);
//签名步骤二:sha1加密
$string = sha1($string);
return $string;
}
///作用:格式化参数,签名过程需要使用
public function formatBizQueryParaMap($paraMap, $urlencode) {
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
// 获取 Access token
public function getAccessToken()
{
$APPID = $this->config['app_id'];
$APPSECRET = $this->config['secret'];
$accessToken = Cache::get('access_token');
if ($accessToken) {
return $accessToken;
}
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$APPSECRET;
$result = curlGetRequest($url);
if (!isset($result['access_token'])) {
return false;
}
$expire = $result['expires_in'] - 5 * 60;
$accessToken = $result['access_token'];
Cache::set('access_token',$accessToken,$expire);
return $accessToken;
}
// 获取 jsapi_ticket
public function getJsapiTicket()
{
$jsapiTicket = Cache::get('jsapi_ticket');
if ($jsapiTicket) {
return $jsapiTicket;
}
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$accessToken."&type=jsapi";
$result = curlGetRequest($url);
if ($result['errmsg'] != 0) {
return false;
}
$expire = $result['expires_in'] - 5 * 60;
$jsapiTicket = $result['ticket'];
Cache::set('jsapi_ticket',$jsapiTicket,$expire);
return $jsapiTicket;
}
}