微信小程序卡卷生成全过程(含源码)

如何在保留秀发的情况下生成微信小程序卡卷

        牢骚话,不用管,直接跳转关键句即可

        对于腾讯的文档,我也是没什么好说的,写成这样也难为他们了,我估计他们自己的开发人员也不怎么懂。

        通过科学上网,找到的资料全都是,这样第一步,中间随便搞搞,然后最后一步就可以了。

        资料啥的,都是一知半解,不可操作,就没有稍微全一点的教程。

        对于开发人员来说,是不是太痛苦了一些,找了半天,山穷水尽快抓狂了,最终从腾讯那边自己实现的源码找到了解决方法,找来正确答案一看,原来是酱紫。

        程序员的头就是这么秃的。

        对此,我只想说

1559277860613010.jpeg

 

说说关键,要在微信小程序里面集成卡卷,需要经过三步,并不像微信文档所说还要激活啥的


1. 公众号和小程序绑定在《公众开放平台https://open.weixin.qq.com/》上

这个实际上是打通小程序和公众号用户系统,可以让同一个用户在两个应用中的身份标识符UnionID是一样的,小程序的用户和公众号的用户可以联系起来,从而可以在小程序应用里面发公众号的卡卷。

 

 

2. 在微信公众号后台,申请卡卷

一般的公众号是默认没有开通的,需要申请开通。

开通之后,添加一张卡卷,折扣卷,优惠卷都可以,然后添加卡卷之后,在《卡卷详情》里面,找到卡卷ID,一般是一串随机字符串,类似于这种

pX7lF1teSm1UlNvgcG3_ayBWVmtE

 

 

3. 后台根据微信公众号appidappscreat,生成小程序领取卡卷参数。小程序端领取卡卷

后台生成代码如下,以php为例

/**
 * 小程序生成卡卷类
 */

class GetAppCard {

    /**
     * 小程序领取卡卷,返回组装好的参数
     * @param string $card_id  公众号卡卷id
     * @param string $ticket  api请求ticket
     * @param string $openid  小程序用户id,不传入也没关系
     * @return array
     */
    public function buildCardParam($card_id,$ticket,$openid=""){
        //获得ticket后将参数拼成字符串进行sha1加密
        $timestamp         = time();
        $nonceStr          = $this->createNonceStr(8);
        $arr['cardId']     = $card_id;
        $arr['timestamp']  = $timestamp;
        $arr['api_ticket'] = $ticket;
        $arr['nonce_str']  = $nonceStr;
        //组装参数
        sort($arr, SORT_STRING);
        $sortString = "";
        foreach($arr as $temp){
            $sortString = $sortString.$temp;
        }
        $signature = sha1($sortString);
        $cardArr = [
            "cardId"=>$card_id,
            "cardExt"=>json_encode([
                'openid'    => $openid,
                'timestamp' => $timestamp,
                'nonce_str' => $nonceStr,
                'signature' => $signature,
            ])
        ];
        return showMsg("200","参数组装完成",$cardArr);
    }

    /**
     *从缓存中取tiket
     */
    public function getCacheTicket(){
        $keyName     ="card_wxTicket";
        $ticketCacheResult = $this->getCache($keyName);
        if($ticketCacheResult["code"] != 200){
            $tokenResult = $this->getAccessToken();
            if($tokenResult["code"] != 200){
                return $tokenResult;
            }
            $ticketResult = $this->getApiTicket($tokenResult["data"]);
            if($ticketResult["code"] == 200){
                $this->addCache($keyName, $ticketResult["data"],60*10);
            }
            return $ticketResult;
        }else{
            return $this->showMsg("200","已缓存数据",$ticketCacheResult);
        }
    }

    /**
     * 根据键值获取缓存
     * @param string $cacheName 获取缓存名
     * @return array
     */
    public function getCache($cacheName)
    {
        $fileName = "./".$cacheName.".json";
        $result   = @file_get_contents($fileName);
        if (!empty($result)){
            $jsonDecode = @json_decode($result,true);
            if(!empty($jsonDecode["expireTime"])){
                $expireTime       = time()-$jsonDecode["createTime"];
                if($jsonDecode["expireTime"] > $expireTime){
                    return $this->showMsg('1','缓存已失效',$jsonDecode);
                }
            }
            return $this->showMsg('200','获取成功',$result);
        }else{
            return $this->showMsg('1','获取失败,缓存不存在,检查是否拥有权限');
        }
    }

    /**
     * 根据键值添加缓存,注意过期时间
     * @param string $cacheName 获取缓存名
     * @param mixed $data       获取缓存名
     * @param int   $expireTime 缓存失效时间
     * @return array
     */
    public function addCache($cacheName,$data,$expireTime =0 )
    {
        $fileName = "./".$cacheName.".json";
        $jsonData = [
            "content"    => $data,
            "expireTime" => $expireTime,
            "createTime" => time(),
        ];
        $result   = @file_put_contents($fileName,json_encode($jsonData));
        if ($result){
            return $this->showMsg('200','添加成功');
        }else{
            return $this->showMsg('1','添加失败,检查是否拥有权限');
        }
    }

    /**
     * 获取微信访问ticket
     * @param string $access_token 微信的token
     * @return mixed
     */
    public function getApiTicket($access_token){
        $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=wx_card";
        $res = $this->api_curls($url);
        $res = json_decode($res,true);
        if (!empty($res['ticket'])){
            return $this->showMsg('200','获取成功',$res['ticket']);
        }else{

            return $this->showMsg('1','获取失败',$res['ticket']);
        }
    }

    /**
     * 获取微信token
     * @return array
     */
    public function getAccessToken()
    {
        $appConfig = [
            "app_id"=>"123", //公众号appid
            "secret"=>"123", //公众号appsecret
        ];
        $getUrl    = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appConfig["app_id"] . "&secret=" . $appConfig["secret"];
        $res       = $this->api_curls($getUrl);
        $result    = json_decode($res, true);
        if(empty($result["access_token"])){
            return $this->showMsg(1,'获取token失败',$result);
        }else{
            return $this->showMsg(200,'获取token成功',$result["access_token"]);
        }
    }

    /**
     * 生成随机字符串
     * @param int $length
     * @return string
     */
    public function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str.= substr($chars, mt_rand(0, strlen($chars) - 1) , 1);
        }
        return $str;
    }

    /**
     * 公用的方法  返回json数据,进行信息的提示
     * @param int    $code 状态    200=成功 1=失败
     * @param string $message 提示信息
     * @param mixed $data 返回数据
     * @return array 格式化后的相应数组
     */
    public function showMsg($code=200,$message = '',$data = "")
    {
        $result = array(
            'code' => $code,
            'message' => $message,
            'data' => $data
        );
        return $result;
    }

    /**
     * 异步请求api
     * @param string $url 请求地址
     * @param mixed $data_string post请求数据
     * @param array $header 自定义header头部
     * @param string $return_header
     * @param string $is_ssl
     * @param string $is_redirect
     * @return mixed|string
     */
    public function api_curls($url, $data_string="",$header=array(),$return_header="no",$is_ssl="no",$is_redirect="no") {
        $ch = curl_init();
        @curl_setopt($ch, CURLOPT_URL, $url);
        @curl_setopt($ch,CURLOPT_TIMEOUT,10);
        if (!empty($header))
        {
            curl_setopt($ch, CURLOPT_HTTPHEADER,$header);  //HEADER
        }
        if ($return_header!="no")
        {
            curl_setopt($ch, CURLOPT_HEADER, 1);
        }
        if ($is_ssl!="no")
        {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if ($data_string!="")
        {
            @curl_setopt($ch, CURLOPT_POST, 1);
            @curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

        }
        if ($is_redirect=="yes")
        {
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION,0);
        }
        $data = @curl_exec($ch);
        if(@curl_errno($ch)){//出错则显示错误信息
            return "";
        }
        @curl_close($ch);
        return $data;
    }

    public function returnJson($data)
    {
        echo json_encode($data);die();
    }
}

//先获取ticket
$cardModel    = new GetAppCard();
$ticketResult = $cardModel->getCacheTicket();
if ($ticketResult["code"] != 200) {
    $cardModel->returnJson($ticketResult);
}
//组装卡卷
$card_id      = "";
$cardResult = $cardModel->buildCardParam($card_id, $ticketResult["data"]);
$cardModel->returnJson($cardResult);

前台小程序调用参数如下

const app = getApp()
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var self =this;
	wx.request({
	  url: 'get_card_param', //仅为示例,并非真实的接口地址
	  data: {openid:666},
	  header: {
		'content-type': 'application/json' // 默认值
	  },
	  success (res) {
        console.log("get_card_param=>", res.data.data);
        if (res.data.code == 200) {
          var cardlist = res.data.data
          self.addCard(cardlist);
        }
	  }
	})	
  },
  //添加卡卷
  addCard:function(cardParam){
    wx.addCard({
      cardList: [cardParam],
      success(res) {
        console.log("卡卷添加成功=>",res.cardList)
      },
      fail(res) {
        console.log("卡卷添加失败=>", res.cardList)
      },
    })
  },
})


4. 如有疑问,可以留下您的评论,大家一起讨论


另外,最后的福利大放送,所有源码下载

发表评论请留下您的大名
  • 最新评论
  • 总共0条评论