php微信分享

9 篇文章 0 订阅
<?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 . "&timestamp=" . $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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值