微信小程序领取卡券

时间:2022-08-30 00:27:15

微信小程序领取卡券

标签(空格分隔): php


开发前需要准备的工作

1 小程序和公众号要有绑定
2 小程序和该公众号要绑定到同一个开发平台下 [https://open.weixin.qq.com/]
3 公众号开通微信卡券功能
4 卡券是在公众号上生成的
5 小程序领取公众号上的卡券

看官方文档

公众号平台卡券文档[https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432]

小程序卡券文档[https://developers.weixin.qq.com/miniprogram/dev/api/card.html]

简单说一下创建卡券:
    我使用的是[创建会议门票]
    接口:http请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_token=ACCESS_TOKEN
    
    参数:
    1 access_token      调用接口凭证
    2 POST数据            JSON数据
    
    POST数据格式:
    1 card_type     string(24)      会议门票类型。
    2 base_info     JSON结构      基本的卡券数据,见下表,所有卡券通用。
    3 meeting_detail    string(3072)    本次会议于2015年5月10号在广州举行,会场地点:xxxx。 会议详情。
    主要就是填充base_info信息自己看文档就明白了 
    
    返回值:
    {
       "errcode":0,
       "errmsg":"ok",
       "card_id":"p1Pj9jr90_SQRaVqYI239Ka1erkI"
    }
    **记得把card_id保存**

小程序领取卡券:

    前端发起请求:wx.addCard(OBJECT)
    后端把需要的参数给前端
    
    参数:
        cardList: [
            {
              cardId: '',
              cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
            }, {
              cardId: '',
              cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
            }
        ]
    cardId : 生成卡券返回的cardId
    cardExt : json字符串
    code : 每一张卡券都有一个code[创建时自己生成的code,这个code有特殊符号限制,和长度限制,自己去感受下微信的坑]
    openid : 用户的openid
    timestamp : 时间戳/秒
    signature : 签名
    
    回调:
        处理你领取成功的业务逻辑
        

示例代码

小程序领取卡券:

    # 领取卡券
    public function receiveCard()
    {
        # 小程序appid
        $appId = input('appid'); 
        # openid
        $openId = input('openid); 
        # 订单id
        $orderId = input('order_id');
        
        $list = $this->getInfo($appId, $openId, $orderId);
        
        # 返回前端json数据格式
        return $list;
    }
    
    
    public function getInfo($appId, $openId, $orderId)
    {
        # 业务处理[比如:是否开启卡券功能 | 是否绑定了公众号 等等等.....]
        if () xxxxxxxxx;
        
        # 查询订单获取保存的 cardId 和 每张卡券的唯一标识 code
        $orderInfo = Db::table('')->field('code, card_id')->where()->select();
        
        # 获取ApiTicket 主要用于生成签名
        1 [签名文档] : [https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115] 
        
        2 [获取access_token] : [https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$config['appid']."&secret=".$config['secret'];]
        
        3 [获取api_ticket] : [https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card]
        
        注意:appid 和 secret 是公众号的,通过小程序的appid查询对应公众号的配置。apiTicket 和 accessToken 应该缓存或者是个公共的方法,避免多个地方使用失效。
        
        # 处理数据返回数据
        foreach ($orderInfo as $key => $value) {
        
            # 生成签名的参数
            # nonce_str 自己生成的随机字符串31位 
            $params = [
                'code'       => $value['code'],
                'api_ticket' => $apiTicket,
                'timestamp'  => time(),
                'nonce_str'  => sp_random_string(31),
                'card_id'    => $value['card_id'],
                'openid'     => $openId
            ];
            $signature = $this->getSignature($params);
            $value['openid'] = $params['openid'];
            $value['timestamp'] = $params['timestamp'];
            $value['signature'] = $signature;
            $data[] = $value;
        }
    }
    
    # 生成签名
    public function getSignature($params)
    {
         sort($params, SORT_STRING);
         return sha1(implode($params));
    }
    
    # 回调 
    public function cardCallBack()
    {
        # $_POST 和 input('post.')  竟然接收不到数据 没办法只能用 $GLOBALS['HTTP_RAW_POST_DATA']
        $postData = $GLOBALS['HTTP_RAW_POST_DATA'];
        $postData = json_decode($postData, true);
        $cardList = $postData['card_list'];
        
        # 把数据转数组
        foreach ($cardList as $k => $v) {
            $v['cardExt'] = json_decode($v['cardExt'], true);
            $data[] = $v;
        }
        foreach ($data as $key => $value) {
            # 业务处理 
        }
    }