<?php
namespace app\video_mall\controller;
use think\Session;
use think\Controller;
use think\Cache;
class WechatShare extends Controller
{
protected $AppId;
protected $AppSecret;
protected $Url;
public function __construct()
{
parent::__construct();
$this->AppId = config('video_mall_wx_appid');
$this->AppSecret = config('video_mall_wx_appsecret');
}
public function index()
{
//微信分享接口
$dataSignPackage = $this->getSignPackage();
dump($dataSignPackage);
$title = '微信分享';
$desc = '每天都是开开心心的,度过新的一天-新!';
$imgUrl = "http://h5.yilianxiaoyuan.com/109.jpg";
$this->assign('title',$title);//标题
$this->assign('desc',$desc);//描述
$this->assign('imgUrl',$imgUrl);//图片
$this->assign('dataSignPackage',$dataSignPackage);
return $this->fetch('test/share');
}
/**
* 微信接口分享
* @param num 16 noncestr
* @return 随机16码函数
*/
protected function getRandCode($num = 16)
{
//随机16码函数
$array = array(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
);
$tmpstr = '';
$max = count($array);
for ($i = 1; $i < 16; $i++) {
$key = rand(0, $max - 1);
$tmpstr .= $array[$key];
}
return $tmpstr;
}
/**
* 1.获取 access_token
* @param $data 接受数据|返回数据 默认为空
* @param
* @return access_token
*/
protected function getWxAccessToken(){
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".trim($this->AppId)."&secret=".trim($this->AppSecret);
$accessTokenRuselt=self::http_curl($url,'get','json');
Cache::set('video_mall_access_token',$accessTokenRuselt,$accessTokenRuselt['expires_in']);
return $accessTokenRuselt['access_token'];
}
/**
* 2.获取 access_token 错误重新调用
* @param code 错误信息
* @param
* @return access_token
*/
protected function getCodeWxAccessToken($code = ''){
if($code){
//频繁调用,可能会导致,access_token 失效
// echo 1222;die;
return $this->getWxAccessToken();
}
$video_mall_access_token = Cache::get('video_mall_access_token');
if($video_mall_access_token){
return $video_mall_access_token['access_token'];
}else{
return $this->getWxAccessToken();
}
}
/**
* 1.获得jsapi_ticket票据
* @param num 16
* @return 随机16码函数
*/
protected function getJsApiTicket()
{
// $AccessToken = 11111;
//获取AccessToken
$AccessToken = $this->getCodeWxAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$AccessToken."&type=jsapi";
$dataJsapiTicket=$this->http_curl($url,'get','json');
if(!in_array('ticket', $dataJsapiTicket)){
//如果 获取AccessToken 正确走这层
Cache::set('video_mall_access_token_ticket',$dataJsapiTicket,$dataJsapiTicket['expires_in']);
}else{
//如果 获取AccessToken 不正确走这层
$AccessToken = $this->getCodeWxAccessToken('code');
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$AccessToken."&type=jsapi";
$dataJsapiTicket=$this->http_curl($url,'get','json');
Cache::set('video_mall_access_token_ticket',$dataJsapiTicket,$dataJsapiTicket['expires_in']);
}
return $dataJsapiTicket['ticket'];
}
/**
* 2.获得jsapi_ticket票据
* @param code 错误码
* @return jsapi_ticket
*/
protected function getCodeJsApiTicket($code = '')
{
if($code){
//频繁调用,可能会导致,获得jsapi_ticket票据 提前失效
return $this->getJsApiTicket();
}
//获取缓存的JsApiTicket信息
$video_mall_access_token_ticket = Cache::get('video_mall_access_token_ticket');
if($video_mall_access_token_ticket){
return $video_mall_access_token_ticket['ticket'];
}else{
return $this->getJsApiTicket();
}
}
/**
* 2.getSignPackage 返回
* @param code 错误码
* @return 分享需要的参数
*/
protected function getSignPackage($url= '') {
//获得jsapi_ticket票据
$jsapiTicket = $this->getCodeJsApiTicket();
if($url){
$url = trim($url);
}else{
$url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
}
$timestamp = time();
$nonceStr = $this->getRandCode();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=" . $jsapiTicket . "&noncestr=" . $nonceStr . "×tamp=" . $timestamp . "&url=" . $url;
$signature = sha1($string);
$signPackage = array(
"appId" => $this->AppId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
}
/**
* http_curl 模拟请求
* @param url 路径 、
* @param type 请求方式
* @param res 是否json 化
* @param arr 参数
* @return 数组
*/
public function http_curl($url,$type='get',$res='json',$arr=''){
//1.初始化curl
$ch =curl_init();
//2.设置curl的参数
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
if($type == 'post'){
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
}
//3.采集
$output =curl_exec($ch);
//4.关闭
if($res=='json'){
if(curl_error($ch)){
//请求失败,返回错误信息
return curl_error($ch);
}else{
//请求成功,返回错误信息
return json_decode($output,true);
}
}
curl_close($ch);
}
/*尾部**/
}
前端代码
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>这是微信分享</div>
<button onclick="show();">微信相册接口</button>
</body>
<!-- <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
wx.config({
// debug: true,
appId: '{$dataSignPackage['appId']}',
timestamp: '{$dataSignPackage['timestamp']}',
nonceStr: '{$dataSignPackage['nonceStr']}',
signature: '{$dataSignPackage['signature']}',
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'chooseImage'
]
});
wx.ready(function () {
// 1 判断当前版本是否支持指定 JS 接口,支持批量判断
wx.checkJsApi({
jsApiList: [
'getNetworkType',
'previewImage',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
],
success: function (res) {
// alert(JSON.stringify(res));
}
});
var shareData = {
title: '{$title}',
desc: '{$desc}',
link: '{$dataSignPackage['url']}',
imgUrl: '{$imgUrl}',
trigger: function (res) {
alert('用户点击发送给朋友');
},
success: function (res) {
alert('已分享11111');
alert(res);
},
cancel: function (res) {
alert('已取消111');
},
fail: function (res) {
// alert(JSON.stringify(res));
}
};
wx.onMenuShareAppMessage(shareData);
wx.onMenuShareTimeline(shareData);
wx.onMenuShareQQ(shareData);
wx.onMenuShareWeibo(shareData);
});
function show(){
wx.chooseImage({
count: 1, // 默认9,这里每次只处理一张照片
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function(res) {
var localId = res.localIds[0].toString();//因为我们只取一张,所以只有将数组的第一项转字符串保存起来传给 getLocalImgData 方法即可
wx.getLocalImgData({
localId: localId, // 图片的localID
success: function(res) {
alert(res);
// var imgUrl = 'data:image/jpeg/png;base64,' + res.localData;
// alert(imgUrl);
console.log(res.localData);
alert(res.localData);
if(window.isIOS) {
console.log('ios');
//这里需要注意的是,尽管ios返回的是base64编码的字符串,但前缀还是有点不一样,是:'data:image/jgp/png;base64';
//网上很多文章都说要按一下方式替换掉‘jgp’为‘jpeg’,但实际操作发现,不替换也可以正常显示,所以本人就不替换了,直接取值使用
//$scope.imgUrl = res.localData.replace('jgp', 'jpeg');//替换‘jgp’为‘jpeg’
// $scope.imgUrl = res.localData;//赋值显示
} else if(window.android) {
// $scope.imgUrl = 'data:image/jpeg/png;base64,' + res.localData; // localData是图片的base64数据,可以用img标签显示
}
}
});
}
});
}
wx.error(function (res) {
alert(res.errMsg);
});
</script>
</html>