微信卡券_微信卡券开发 - CSDN
精华内容
参与话题
  • 浅谈微信卡券功能开发(1)

    千次阅读 2015-07-22 15:38:36
    闲扯  由于公司的业务,有幸接触到了微信... 貌似闲话说的太多了,接下来我就我自己对于微信卡券功能的开发经验进行简单的介绍,在微信开发的交流群中也看到很多新手开发者遇到的问题,希望本文能够帮助刚接触微

    闲扯

        由于公司的业务,有幸接触到了微信平台的开发,不得不感慨下,微信的业务规划实在是宏大的很呢。看来微信是想涉及生活的各个方面啊,再加上最近微信封杀各路豪杰(网易音乐、支付宝钱包)等,不难看出微信在产品规划上的野心。

        貌似闲话说的太多了,接下来我就我自己对于微信卡券功能的开发经验进行简单的介绍,在微信开发的交流群中也看到很多新手开发者遇到的问题,希望本文能够帮助刚接触微信卡券的同学尽快的入门卡券功能开发,由于鄙人是NODEJS码农,所以本文主要以NODEJS为开发语言,其他语言的开发者可以飘过~或者借鉴~~

        又一段闲话...(年纪大了,话唠了),先简单的介绍下微信卡券功能,卡券,说白了就是各种各样的优惠券,会员卡,以及各种票据等等等等,涉及的方面很广,就目前接触到的开发者来看,大多数都是对于各类优惠券的开发,其他的种类比较少了。

        首先使用卡券功能,需要现在微信公众号平台中开启卡券功能。具体的开启步骤就不详述了,文档里面介绍的很详细(对了,附下官方文档下载地址),下面开始聊一聊开发步骤。

     

    准备

        微信提供了对于卡券的操作和管理接口,实质上就是向各个接口发送请求,最简单的,你都可以在html种建立个表单,然后填写接口需要的数据,然后POST或者GET到微信的接口地址就可以了。但是,通常我们不会这样做,因为我们的业务中可能有很多需求是微信接口无法满足的,有些信息是需要我们自己管理的。

        在开发中,我们借助到了一个NodeJS的module,当然,大家也可以直接使用nodejs的request发送请求,但是毕竟有好多需要注意的东西,module会帮我们考虑到,我在下文也会将需要注意的地方进行说明,以便其他语言开发能够注意到。

     

    Access Token

        首先我们先通过npm安装一个module。不想使用module的同学自行略过本步骤。

        Module为 wechat-card, 可以到github上查看其相关文档,遗憾的是,这个module目前仅支持大多数的优惠券和红包,对于会员卡还有其他的门票类卡券并不支持。相信之后的版本应该会完善的,好在这些类型已经可以满足基本使用了。

    1
    npm install wechat-card --save

        ok, 完整完成后要进行一个全局的设置。

    1
    2
    3
    4
    5
    6
    var wxCard = require("wechat-card");
     
    wxCard.setConfig({
        appId: "wxXXXXXXX",
        appSecret: "bulabulabulabula"
    });

        这里有东西要进行说明:首先这里有两个量说明下,appId和appSecret,这两个量可以在微信MP平台的开发者中心中得到,他们两个虽然只是路人,但是,他们两个会创造出一个结晶,叫做access_token,这个可是一个非常重要的而且脾气古怪的小朋友了。说他重要,因为他贯穿整个接口,不仅仅是卡券会用到,所以微信平台的接口都可能会使用到他;说他脾气古怪,是因为他有个特别的属性,7200秒(2小时)会过期,而且每天只能请求2000次。那么,这就要求我们要去管理access_token的生成,定时去刷新他。如果使用上述的NODEJS MODULE的话,只需要在setConfig中配置appId和appSecret,Module就会自动为我们管理Token了。

        题外话,如果我们的产品中不仅仅用到了微信卡券功能,还使用到了其他的微信功能,而这些功能中也用到了access token,那么这时候就不可以将token交由某个功能区管理了,因为当一边刷新access  token以后,另一边的就会失效,针对这种情况,我们应该有一个服务来为各个功能提供access token,那么这里不可以配置appId和appSecret了,Module提供了另外一个配置:

    1
    2
    3
    wxCard.setConfig({
        accessTokenService: "http://xxxx.xxxx.xxx/xxx"
    });

        这里通过配置一个公开的服务来获取access token,需要注意的是,这里的2小时过期,以及请求次数都需要这个服务自行去管理了。

     

    创建门店

        我们在创建卡券之前,需要先创建门店。这里我们先解释下,门店,其实就是实际商户下的店面,举个栗子,肯德基就是一个商户,那么肯德基北京西站店就是一个门店,我们的卡券会有一个”适用门店“的选项需要对应各个门店。所以我们需要先创建各个门店以备适用。

        查看官方文档我们可以了解到一个创建门店的接口:

    1
    https://api.weixin.qq.com/card/location/batchadd?access_token=TOKEN

        前面我们介绍了获取access token的方法,这里我们可以看到token的用途,在请求每一个接口时都需要附带token。我们可以直接向接口发送请求来完成操作。这里我们使用Module来进行创建门店:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // Demo数据,具体的字段含义,可以参加Wechat-Card的GITHUB或者官方文档
    var shops = [{
        "business_name":"麦当劳",
        "branch_name":"赤岗店",
        "province":"广东省",
        "city":"广州市",
        "district":"海珠区",
        "address":"中国广东省广州市海珠区艺苑路 11 号",
        "telephone":"020-89772059",
        "category":"房产小区",
        "longitude":"115.32375",
        "latitude":"25.097486"
    }, {
        "business_name":"麦当劳",
        "branch_name":"珠江店",
        "province":"广东省",
        "city":"广州市",
        "district":"海珠区",
        "address":"中国广东省广州市海珠区艺苑路 12 号",
        "telephone":"020-89772059",
        "category":"房产小区",
        "longitude":"113.32375",
        "latitude":"23.097486"
    }];
     
    wxCard.shop.batchAddShops(shops, function(err, ids) {
        // 这里添加成功了,ids为添加的门店的ID
    });

        这里需要说明的是:添加成功后,回到函数返回值ids为之前添加数据对应的id,如果其中有数据添加失败了,那么对应的ID为-1.

     

    查询门店列表

        和创建门店相同,我们可以获取到已经添加的门店列表。接口为:

    1
    https://api.weixin.qq.com/card/location/batchget?access_token=TOKEN

        Module中的查询方法为:

    1
    2
    3
    4
    5
    6
    // 微信提供的查询方法为一种分页式的查询方法
    // offset为起始记录的位置,count为返回数据的数量
    var offset = 0, count = 10;
    wxCard.shop.batchGetShops(offset, count, function(err, shops) {
        // 查询成功,shops为返回的信息
    });

        这里需要说明的是:微信限制了最大返回的数量为50,即count最大值为50,接口返回的字段可以参考Module文档或者官方文档。

     

    小结

        时间不早了,明天还得上班~~这一篇先写到这,其他的接口大家可以参照本文中介绍的方法进行尝试,方法都是大同小异的,也可以参考Module文档,作为一个入门的经验,希望可以帮助到大家。如果其中有什么错误或者不好的地方, 希望大家能够指明,万分感谢,明晚咱们继续~~

     

    转载请注明出处,原网页http://www.cnblogs.com/kenticny/p/4285190.html

    展开全文
  • 最近我在做一个微信卡券的项目,在微信公众号新建了卡券,在项目中需要做查询,把微信公众号建的卡券查询出来并存到数据库中,记录一下开发流程,省的以后走弯路 二、注意 调取卡券使用的access_token是普通access...

    一、介绍

    最近我在做一个微信卡券的项目,在微信公众号新建了卡券,在项目中需要做查询,把微信公众号建的卡券查询出来并存到数据库中,记录一下开发流程,省的以后走弯路

    二、注意

    调取卡券使用的access_token是普通access_token

    获取普通access_token方法:https://blog.csdn.net/cl11992/article/details/86304653

    三、代码实例

    下面代码需要的类

    UrlConUtil:https://blog.csdn.net/cl11992/article/details/86303800

    /**
     * 秒转换为指定格式的日期
     * @param second
     * @param patten
     * @return
     */
    private String secondToDate(long second,String patten) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(second * 1000);//转换为毫秒
        Date date = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat(patten);
        String dateString = format.format(date);
        return dateString;
    }
    
    /**
     * 查询卡券
     * @param accessToken	普通access_token
     * @param cardId	第三方卡券id
     * @return
     */
    private JSONObject getCard(String accessToken, String cardId){
    	JSONObject json = new JSONObject();
    	try{
    		JSONObject paramjson = new JSONObject();
            String url="https://api.weixin.qq.com/card/get?access_token="+accessToken;
            paramjson.put("card_id", cardId);
            JSONObject object = UrlConUtil.httpsRequest(url, "POST", paramjson.toString());
            int errcode = (int) object.get("errcode");
            if(errcode!=0){
            	json.put("success", false);
    			json.put("msg", "查询失败");
    			return json;
            }
            Map<String,Object> resultMap = (Map<String, Object>) object.get("card");
        	if(resultMap.isEmpty()){
        		json.put("success", false);
    			json.put("msg", "查询失败");
    			return json;
    		}
    		Map<String, Object> generalCouponMap  = (Map<String, Object>) resultMap.get("general_coupon");
    		Map<String, Object> baseInfoMap  = (Map<String, Object>) generalCouponMap.get("base_info");
    		Map<String, Object> dateInfoMap  = (Map<String, Object>) baseInfoMap.get("date_info");
    		Map<String, Object> skuMap  = (Map<String, Object>) baseInfoMap.get("sku");
    		//卡券类型
        	String cardType = (String)resultMap.get("card_type");
        	json.put("cardType", cardType);
    		//卡券名称
        	String name = (String)baseInfoMap.get("title");
        	json.put("name", name);
    		//卡券logo
        	String logo = (String)baseInfoMap.get("logo_url");
        	json.put("logo", logo);
    		//开始时间(秒数需要转换格式)
    		int beginTimestamp = (int)dateInfoMap.get("begin_timestamp");
    		String beginDate = secondToDate(beginTimestamp,"yyyy-MM-dd");
    		json.put("beginDate", beginDate);
    		//到期时间(秒数需要转换格式)
    		int endTimestamp = (int)dateInfoMap.get("end_timestamp");
    		String endDate = secondToDate(endTimestamp,"yyyy-MM-dd");
    		json.put("endDate", endDate);
    		//卡券总数量
    		int allCount = (int)skuMap.get("total_quantity");
    		json.put("allCount", allCount);
    		//卡券剩余数量
    		int surplusCount = (int)skuMap.get("quantity");
    		json.put("surplusCount",surplusCount);
    		//卡券说明
    		String explain = (String) baseInfoMap.get("description");
    		json.put("explain", explain);
    		//卡券领取限制
    		int singleCount = (int)skuMap.get("get_limit");
    		json.put("singleCount",singleCount);
    		//卡券详情返回数据
    		json.put("returnValue",resultMap);
    		//返回内容
    		json.put("success", true);
    		json.put("msg", "操作成功");
    		return json;
    	}catch (Exception e) {
    		json.put("success", false);
    		json.put("msg", "查询失败");
    		return json;
    	}
    }

     

    展开全文
  • 微信卡券自写接口

    2020-05-12 12:28:06
    微信卡券自写接口 namespace kj; //卡券相关类 class weiXinKaJuan { private $appid; private $appsecret; public function __construct($appid,$appsecret) { $this->appid = $appid; $this->appsecret...
    <?php
    namespace kj;
    
    //卡券相关类
    class weiXinKaJuan
    {
        private $appid;
        private $appsecret;
    
        public function __construct($appid,$appsecret)
        {
            $this->appid = $appid;
            $this->appsecret = $appsecret;
        }
    
        /**
         * 核销--线上核销
         * @param string $type 创建的卡券类型
         * @param string $pic 卡券的logo
         * @return array 返回卡卷所需的Json数据
         */
        public function codeEncrypt($data)
        {
    
            $data = json_decode($data,true);
            $data = $data['0'];
            $token = $this->getAcctoken();
            $url = "https://api.weixin.qq.com/card/code/decrypt?access_token=".$token;
            $datas['encrypt_code'] = $data['encrypt_code'];
            $data_post = json_encode($datas,JSON_UNESCAPED_UNICODE);
            $res = $this->postUrl($url,$data_post);
            $arr = json_decode($res,true);
            if($arr['errcode']>0){
                return $arr;
            }else{
                return $this->codeUse($arr['code'],$data['card_id']);
            }
        }
    
        /**
         * 核销--核销
         * @param string $type 创建的卡券类型
         * @param string $pic 卡券的logo
         * @return array 返回卡卷所需的Json数据
         */
        public function codeUse($code,$card_id)
        {
            if($this->codeStatus($code,$card_id)){
                $token = $this->getAcctoken();
                $url = "https://api.weixin.qq.com/card/code/consume?access_token=".$token;
                $data = array(
                    "code"=>$code,
                );
                $data_post = json_encode($data,JSON_UNESCAPED_UNICODE);
                $res = $this->postUrl($url,$data_post);
                $arr = json_decode($res,true);
                return $arr;
            }else{
                return '卡券无效';
            }
    
        }
    
        /**
         * 核销--查询code
         * @param string $code code
         * @param string $card_id 卡券的card_id
         * @return bool true/false
         */
        private function codeStatus($code,$card_id)
        {
            $token = $this->getAcctoken();
            $url = "https://api.weixin.qq.com/card/code/get?access_token=".$token;
            $data = array(
                "card_id"=>$card_id,
                "code"=>$code,
                "check_consume"=>true
            );
            $data_post = json_encode($data,JSON_UNESCAPED_UNICODE);
            $res = $this->postUrl($url,$data_post);
            $arr = json_decode($res,true);
            if($arr['errcode'] > 0){
                return false;
            }else {
                return $arr['can_consume'];
            }
        }
    
        /**
         * 投放--群发 根据表情发送图文消息
         * @param string $type 创建的卡券类型
         * @param string $pic 卡券的logo
         * @return array 返回卡卷所需的Json数据
         */
        public function sendQunfa($media_id){
            $token = $this->getAcctoken();
            $url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=".$token;
            $data = array(
                "filter"=>array(
                    "is_to_all"=>true
                ),
                "mpnews"=>array(
                    "media_id"=>$media_id
                ),
                "msgtype"=>"mpnews",
                "send_ignore_reprint"=>0
            );
            $data_post = json_encode($data,JSON_UNESCAPED_UNICODE);
            $res = $this->postUrl($url,$data_post);
            $arr = json_decode($res,true);
            return $arr;
        }
    
        /**
         * 投放--群发添加新素材
         * @param string $card_id 卡券card_id
         * @return array 返回卡卷所需的Json数据
         */
        public function sendNewsucai($card_id)
        {
            $token = $this->getAcctoken();
            $arr = $this->sendGroup($card_id);
            $content = $arr['content'];
            $url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=".$token;
            $pic = $this->setScpic('./300300.png');
            $data['title'] = '群发卡券';
            $data['thumb_media_id'] = $pic;
            $data['authod'] = 'test';
            $data['content_source_url'] = '11';
            $data['content'] = $content;
            $data['show_cover_pic'] = 1;
            $data['digest'] = '111';
            $datas['articles'][] = $data;
            $data_post = json_encode($datas,JSON_UNESCAPED_UNICODE);
            $res = $this->postUrl($url,$data_post);
            $arr = json_decode($res,true);
            return $arr['media_id'];
        }
    
        /**
         * 投放--上传素材图片
         * @param string $path 图片本地地址
         * @return string 返回图片路径
         */
        public function setScpic($path)
        {
            $scmedia_id = isset($_COOKIE['scmedia_id'])?$_COOKIE['scmedia_id']:'';
            if($scmedia_id == '') {
                $token = $this->getAcctoken();
                $url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$token;
                $filedata = array(
                    "media"  => "@".$path,
                    "type"  =>  "image",
                );
                $result = $this->postUrl($url, $filedata);
                $arr = json_decode($result, true);
                if ($arr['media_id'] != '') {
                    setcookie("sucaipic", $arr['media_id'], time() + 315360000);
                    return $arr['media_id'];
                } else {
                    return $arr['errmsg'];
                }
            }else {
                setcookie("scmedia_id", $scmedia_id, time() + 315360000);
                return $scmedia_id;
            }
        }
    
        /**
         * 投放--群发获取素材
         * @param string $type 创建的卡券类型
         * @param string $pic 卡券的logo
         * @return array 返回卡卷所需的Json数据
         */
        public function sendGroup($card_id)
        {
            $token = $this->getAcctoken();
            $url = "https://api.weixin.qq.com/card/mpnews/gethtml?access_token=".$token;
            $data['card_id'] = $card_id;
            $data_post = json_encode($data,JSON_UNESCAPED_UNICODE);
            $res = $this->postUrl($url,$data_post);
            $arr = json_decode($res,true);
            return $arr;
        }
    
        /**
         * 投放--创建卡券领取货架
         * @param string $type 创建的卡券类型
         * @param string $pic 卡券的logo
         * @return array 返回卡卷所需的Json数据
         */
        public function setHuojia($card_id_arr)
        {
            $token = $this->getAcctoken();
            $url = "https://api.weixin.qq.com/card/landingpage/create?access_token=".$token;
            $data = array(
                "banner"=>"http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFN",
                "page_title"=> "优惠大派送",
                "can_share"=>true,
                "scene"=>"SCENE_NEAR_BY",
                "card_list"=>$card_id_arr
            );
            $data_post = json_encode($data,JSON_UNESCAPED_UNICODE);
            $res = $this->postUrl($url,$data_post);
            $arr = json_decode($res,true);
            return $arr;
        }
    
        /**
         * 投放--创建二维码
         * @param string $card_id 卡券的card_id
         * @return html 返回二维码图片
         */
        public function setQrcodepic($card_id)
        {
            $arr = $this->setQrcode($card_id);
            if($arr['errcode'] > 0){
                return $arr;
            }else{
                $ticket = $arr['ticket'];
                $url ="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket;
                return "<img src='".$url."'>";
            }
        }
    
        /**
         * 投放--创建二维码
         * @param string $card_id 卡券的card_id
         * @return array 返回卡卷所需的Json数据
         */
        private function setQrcode($card_id)
        {
            $token = $this->getAcctoken();
            $url = "https://api.weixin.qq.com/card/qrcode/create?access_token=".$token;
            $data = array(
                "action_name"=>"QR_CARD",
                "expire_seconds"=>1800,
                "action_info"=>array(
                    "card"=>array(
                        "card_id"=>$card_id,
                        "is_unique_code"=>false ,
                        "outer_str"=>"12b"
                    )
                )
            );
            $data_post = json_encode($data,JSON_UNESCAPED_UNICODE);
            $res = $this->postUrl($url,$data_post);
            $arr = json_decode($res,true);
            return $arr;
        }
    
        /**
         * 创建---卡券
         * @param string $type 创建的卡券类型
         * @param string $data 卡券的相关信息
         * $data = array(
        'pic'=>$pic,
        'type'=>'GROUPON',
        'brand_name'=>'',
        'code_type'=>'CODE_TYPE_QRCODE',
        'title'=>'团购券',
        'color'=>'Color010',
        'notice'=>'使用时向服务员出示此券',
        'service_phone'=>'服务电话',
        'description'=>'不可与其他优惠同享\n如需团购券发票,请在消费时向商户提出\n店内均可使用,仅限堂食',
        'date_info'=>array(
        'type'=>'DATE_TYPE_FIX_TIME_RANGE',
        'begin_timestamp'=>1566382996,
        'end_timestamp'=>1566469396
        ),
        'sku'=>array(
        'quantity'=>500000
        ),
        'use_limit'=>1000,
        'get_limit'=>3,
        'use_custom_code'=>false,
        'bind_openid'=>false,
        'can_share'=>true,
        'can_give_friend'=>true,
        'use_all_locations'=>true,
        'source'=>'大众点评',
        'use_condition'=>array(
        "accept_category"=>"鞋类",
        "reject_category"=>"阿迪达斯",
        "can_use_with_other_discount"=>true
        ),
        'abstract'=>array(
        "abstract"=>"微信餐厅推出多种新季菜品,期待您的光临",
        "icon_url_list"=>array("http://mmbiz.qpic.cn/mmbiz/p98FjXy8LacgHxp3sJ3vn97bGLz0ib0Sfz1bjiaoOYA027iasqSG0sj
        piby4vce3AtaPu6cIhBHkt6IjlkY9YnDsfw/0")
        ),
        'text_image_list'=>array(
        array(
        "image_url"=> "http://mmbiz.qpic.cn/mmbiz/p98FjXy8LacgHxp3sJ3vn97bGLz0ib0Sfz1bjiaoOYA027iasqSG0sjpiby4vce3AtaPu6cIhBHkt6IjlkY9YnDsfw/0",
        "text"=>"此菜品精选食材,以独特的烹饪方法,最大程度地刺激食 客的味蕾"
        ),
        array(
        "image_url"=> "http://mmbiz.qpic.cn/mmbiz/p98FjXy8LacgHxp3sJ3vn97bGLz0ib0Sfz1bjiaoOYA027iasqSG0sjpiby4vce3AtaPu6cIhBHkt6IjlkY9YnDsfw/0",
        "text"=>"此菜品精选食材,以独特的烹饪方法,最大程度地刺激食 客的味蕾"
        )
        ),
        'time_limit'=>array(
        array(
        "type"=>"MONDAY",
        "begin_hour"=>0,
        "end_hour"=>10,
        "begin_minute"=>10,
        "end_minute"=>59
        ),
        array(
        "type"=>"HOLIDAY"
        )
        ),
        'business_service'=>array(
        "BIZ_SERVICE_FREE_WIFI",
        "BIZ_SERVICE_WITH_PET",
        "BIZ_SERVICE_FREE_PARK",
        "BIZ_SERVICE_DELIVER"
        ),
        );
         * @return json 返回信息
         */
        public function addCard($data)
        {
            $token = $this->getAcctoken();
            $url = "https://api.weixin.qq.com/card/create?access_token=".$token;
            $data_post = $this->cardInfo($data);
            if($data_post == ''){
    
                return error;
            }
            $res = $this->postUrl($url,$data_post);
            return $res;
        }
    
        /**
         * 上传卡券图片
         * @param string $path 图片本地地址
         * @return string 返回图片路径
         */
        public function setPic($path)
        {
            $pic = isset($_COOKIE['pic'])?$_COOKIE['pic']:'';
            if($pic == '') {
                $token = $this->getAcctoken();
                $url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" . $token;
                $data = array('buffer' => '@' . $path);
                $res = $this->postUrl($url, $data);
                $arr = json_decode($res, true);
                if ($arr['url'] != '') {
                    setcookie("pic", $arr['url'], time() + 315360000);
                    return $arr['url'];
                } else {
                    return $arr['errmsg'];
                }
            }else {
                setcookie("pic", $pic, time() + 315360000);
                return $pic;
            }
        }
    
        /**
         * 获取access_token
         * @return string  access_token
         */
        public function getAcctoken()
        {
            $token = isset($_COOKIE['access_token'])?$_COOKIE['access_token']:'';
            if($token == '' || $this->is_time($token)){
                    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret;
                    $json = $this->getUrl($url);
                    $arr = json_decode($json,true);
                    setcookie("access_token", $arr['access_token'], time()+$arr['expires_in']);
                    return $arr['access_token'];
            }else{
                return $token;
            }
        }
    
        /**
         * 获取access_token
         * @param string $token access_token
         * @return bool true/false
         */
        private function is_time($token)
        {
            $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$token;
            $json = $this->getUrl($url);
            $arr = json_decode($json,true);
            if($arr['errcode'] > 0){
                return true;
            }else{
                return false;
            }
        }
    
        /**
         * 创建卡券信息接口
         * @param array $data 创建的卡券信息
         * @return json 返回卡卷所需的Json数据
         */
        private function cardInfo($data)
        {
            $mr = array('pic','type');
            $canshu = array('logo_url', 'brand_name', 'code_type', 'title', 'color','notice','service_phone','description',
                'date_info','sku',
                'use_limit','get_limit','use_custom_code','bind_openid','can_share','can_give_friend',
                'location_id_list',
                'center_title','center_sub_title','center_url','custom_url_name','custom_url','custom_url_sub_title','promotion_url_name','promotion_url','source','use_all_locations'
            );
            $arr = array();
            $pic = $this->setPic($data['pic']);
            $base_info = array();
            $advanced_info = array();
            $base_info['logo_url'] = $pic;
            foreach ($data as $k=>$v) {
                if(in_array($k,$canshu))
                {
                    $base_info[$k] = $v;
                }else if(!in_array($k,$mr)){
                    $advanced_info[$k] = $v;
                }
            }
            switch ($data['type']){
                case 'GROUPON';//团购券
                    $arr['card_type'] = 'GROUPON';
                    $arr['groupon']['base_info'] = $base_info;
                    $arr['groupon']['advanced_info'] = $advanced_info;
                    $arr['groupon']['deal_detail'] = "双人套餐\n -进口红酒一支。\n孜然牛肉一份。";
                    break;
                case 'CASH';//代金券
                    $arr['card_type'] = 'CASH';
                    $arr['cash']['base_info'] = $base_info;
                    $arr['cash']['advanced_info'] = $advanced_info;
                    $arr['cash']['least_cost'] = 1000;
                    $arr['cash']['reduce_cost'] = 100;
                    break;
                case 'DISCOUNT';//折扣券
                    $arr['card_type'] = 'DISCOUNT';
                    $arr['discount']['base_info'] = $base_info;
                    $arr['discount']['advanced_info'] = $advanced_info;
                    $arr['discount']["discount"] = 20;
                    break;
                case 'GIFT';//兑换券
                    $arr['card_type'] = 'GIFT';
                    $arr['gif']['base_info'] = $base_info;
                    $arr['gif']['advanced_info'] = $advanced_info;
                    $arr['gif']['gift'] = '可兑换音乐木盒一个';
                    break;
                case 'GENERAL_COUPON';//优惠券
                    $arr['card_type'] = 'GENERAL_COUPON';
                    $arr['general_coupon']['base_info'] = $base_info;
                    $arr['general_coupon']['advanced_info'] = $advanced_info;
                    $arr['general_coupon']['default_detail'] = "优惠券专用,填写优惠详情";
                    break;
                default;
                    return '';
            }
            $show['card'] = $arr;
            return json_encode($show,JSON_UNESCAPED_UNICODE);
        }
    
        /**
         * curl-get
         * @param string $url 地址
         * @return json 返回信息
         */
        private function getUrl($url)
        {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;
            curl_setopt($curl, CURLOPT_BINARYTRANSFER, true) ;
            curl_setopt($curl, CURLOPT_HTTPHEADER, array());
            curl_setopt($curl, CURLINFO_HEADER_OUT, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            $data = curl_exec($curl);
            curl_close($curl);
            return $data;
    
        }
    
        /**
         * curl-post
         * @param string $url 地址
         * @param array $post_data 提交数据
         * @return json 返回信息
         */
        private function postUrl($url,$post_data)
        {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
            curl_setopt($curl, CURLOPT_HTTPHEADER, array());
            curl_setopt($curl, CURLINFO_HEADER_OUT, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            $data = curl_exec($curl);
            curl_close($curl);
            return $data;
        }
    }
    
    
    展开全文
  • 微信小程序与卡券功能小结

    千次阅读 2019-08-19 09:49:47
    微信小程序与卡券功能小结 前段时间公司有一个小程序的项目,其中有与卡券打通的功能,但是微信的官方文档实在是一言难尽。。。找了很多资料才解决这个问题,其中涉及到卡券的领取,卡券的核销等,在这里做一个小结...

    微信小程序与卡券功能小结

    前段时间公司有一个微信小程序的项目,其中有与卡券打通的功能,但是微信的官方文档实在是一言难尽。。。找了很多资料才解决这个问题,其中涉及到卡券的领取,卡券的核销等,在这里做一个小结方便使用。

    一、需求描述

    用户可以在小程序内查看卡券,核销卡券。

    二、功能实现

    微信的卡券事件是发生在公众号里的,由公众号发出卡券,用户领取时微信会推送事件给开发者,开发者可以通过该事件获取到用户的信息和卡券的信息。这一步可以将用户领取过的所有卡券记录下来,方便之后和用户一一对应,以便在小程序中找到用户拥有什么卡券。

    1.卡券的领取事件推送

    微信官方文档的卡券事件

    //可以将获得的参数写入数据库以便后续操作
    string eventType = rootElement.SelectSingleNode("Event") == null ? "" : rootElement.SelectSingleNode("Event").InnerText;
    if (eventType == "user_get_card") {
        HttpContext.Current.Response.Write("");
        string FromUserName = rootElement.SelectSingleNode("FromUserName");
        string CardId = rootElement.SelectSingleNode("CardId");
        string IsGiveByFriend = rootElement.SelectSingleNode("IsGiveByFriend");
        string UserCardCode = rootElement.SelectSingleNode("UserCardCode");
        string FriendUserName = rootElement.SelectSingleNode("FriendUserName");
        string OuterId = rootElement.SelectSingleNode("OuterId");
        string OldUserCardCode = rootElement.SelectSingleNode("OldUserCardCode");
        string OuterStr = rootElement.SelectSingleNode("OuterStr");
        string IsRestoreMemberCard = rootElement.SelectSingleNode("IsRestoreMemberCard");
        string IsRecommendByFriend = rootElement.SelectSingleNode("IsRecommendByFriend");
        string UnionId = rootElement.SelectSingleNode("UnionId");
    }
    

    2.卡券的删除事件推送

    在这里插入图片描述

    if (eventType == "user_del_card") {
        HttpContext.Current.Response.Write("");
        string FromUserName = rootElement.SelectSingleNode("FromUserName");
        string CardId = rootElement.SelectSingleNode("CardId");
        string UserCardCode = rootElement.SelectSingleNode("UserCardCode");
    }
    

    3.卡券的核销事件推送

    在这里插入图片描述

    if (eventType == "user_consume_card") {
        HttpContext.Current.Response.Write("");
        string FromUserName = rootElement.SelectSingleNode("FromUserName");
        string CardId = rootElement.SelectSingleNode("CardId");
        string UserCardCode = rootElement.SelectSingleNode("UserCardCode");
        string ConsumeSource = rootElement.SelectSingleNode("ConsumeSource");
    }
    

    之所以先把卡券推送事件写出来的原因是:微信公众号与微信小程序之间是靠 UnionId 来关联的,在绑定了同一个开放平台(微信开放平台)下的公众号和小程序,每一个用户都有一个独立的UnionId,这个UnionId在这些公众号和小程序下是相同的,因此可以通过UnionId来匹配到用户在公众号内领取到的卡券。

    4.在小程序内查看用户的卡券

    在得到卡券信息后,我们就可以通过小程序内用户授权拿到的UnionId,来判断用户有什么卡券了。
    第一步需要先获取到用户的UnionId。

    //1.先调用wx.login获取到登录的Code
    wx.login({
        success: function (res) {
            let code = res.code;
        }
    })
    
    //2.把这个Code作为参数,去获取登录态的Session_key
    string code = "******";
    string appid = "******";
    string appsecret = "******";
    Stream instream = null;
    StreamReader sr = null;
    HttpWebResponse response = null;
    HttpWebRequest request = null;
    Encoding encoding = Encoding.UTF8;
    try {
        string url = string.Format("https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code", appid, appsecret, code);
        request = WebRequest.Create(url) as HttpWebRequest;
        CookieContainer cookieContainer = new CookieContainer();
        request.CookieContainer = cookieContainer;
        request.AllowAutoRedirect = true;
        request.Method = "GET";
        request.ContentType = "application/x-www-form-urlencoded";
        //发送请求并获取相应回应数据
        response = request.GetResponse() as HttpWebResponse;
        //直到request.GetResponse()程序才开始向目标网页发送Post请求
        instream = response.GetResponseStream();
        sr = new StreamReader(instream, encoding);
        //返回结果网页(html)代码
        string content = sr.ReadToEnd();
        return content;
    } catch (Exception ex) {
        return ex;
    }
    
    //接着将返回的SessionKey和通过wx.getUserInfo接口获得的加密信息encryptedData和iv,通过解密得到UnionId。
    string session_key = "******";
    string encryptedData = "******";
    string iv = "******";
    try {
        byte[] iv2 = Convert.FromBase64String(iv);
        if (string.IsNullOrEmpty(encryptedData)) return“ 解密失败”;
        Byte[] toEncryptArray = Convert.FromBase64String(encryptedData);
        System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged {
            Key = Convert.FromBase64String(session_key),
                IV = iv2,
                Mode = System.Security.Cryptography.CipherMode.CBC,
                Padding = System.Security.Cryptography.PaddingMode.PKCS7
        };
        System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
        Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        string ra = Encoding.UTF8.GetString(resultArray); //解密成功字符串,其中包括UnionId
        return ra;
    } catch (Exception ex) {
        return ex;
    }
    

    在我们获取到UnionId之后,就已经完成了在小程序内查看卡包的功能。由于在之前的卡券推送事件中获取又到了卡券的Code和用户的unionid,又在小程序里得到了用户的unionid,在绑定同一开放平台的情况下,我们不难得出用户拥有哪些卡券,再调用核销接口,就可以核销掉用户的卡券了。

    由于某些卡券是有条件的,所以我们可以调用接口查看卡券的详细信息进行筛选。

    string cardid = "******";
    string code = "******";
    try {
        string access_token = GetAccessToken();
        string url = string.Format("https://api.weixin.qq.com/card/membercard/userinfo/get?access_token={0}", access_token);
        string result = "";
        HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        StringBuilder builder = new StringBuilder();
        int i = 0;
        string postData = "{\"card_id\":\"" + cardid + "\",\"code\":\"" + code + "\"}";
        byte[] data = Encoding.UTF8.GetBytes(postData);
        req.ContentLength = data.Length;
        using(Stream reqStream = req.GetRequestStream()) {
            reqStream.Write(data, 0, data.Length);
            reqStream.Close();
        }
        HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
        Stream stream = resp.GetResponseStream();
        //获取响应内容
        using(StreamReader reader = new StreamReader(stream, Encoding.UTF8)) {
            result = reader.ReadToEnd();
        }
        return result;
    } catch (Exception ex) {
        return ex;
    }
    

    5.核销卡券

    try {
        string code = "******";
        string unionid = "******";
        string storeId = "******";
        string token = GetAccessToken();
        string url = string.Format("https://api.weixin.qq.com/card/code/consume?access_token={0}", token);
        string result = "";
        HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        StringBuilder builder = new StringBuilder();
        int i = 0;
        string postData = "{\"code\":\"" + code + "\"}";
        byte[] data = Encoding.UTF8.GetBytes(postData);
        req.ContentLength = data.Length;
        using(Stream reqStream = req.GetRequestStream()) {
            reqStream.Write(data, 0, data.Length);
            reqStream.Close();
        }
        HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
        Stream stream = resp.GetResponseStream();
        //获取响应内容
        using(StreamReader reader = new StreamReader(stream, Encoding.UTF8)) {
            result = reader.ReadToEnd();
        }
        return result;
    } else {
        return false;
    }
    } catch (Exception ex) {
        return false;
    }
    

    至此,我们便完成了如何在小程序内查看并使用微信公众号领取的卡券。但是还有一种情况便是我们在小程序内领取会员卡,这里也一并写上。
    添加卡券

    //首先需要获取到会员卡的必要参数(这里用到了Senparc的DLL)
    	string access_token = "******";
    	string ticket = “******”; //只需要将access_token传入接口后便可获得,这里不再列出方法
    	string nonceStr = TenPayV3Util.GetNoncestr();
    	string timeStamp = TenPayV3Util.GetTimestamp();
    	string card_id = "******";
    	string signature = GetCardSignature(ticket, card_id, nonceStr, timeStamp, out signature);
    	string jsonStr = "{\"Ticket\":\"" + ticket + "\",\"NonceStr\":\"" + nonceStr + "\",\"TimeStamp\":\"" + timeStamp + "\",\"CardId\":\"" + card_id + "\",\"Signature\":\"" + signature.ToLower() + "\"}";
    	return jsonStr;
    	
    //获取签名
    public string GetCardSignature(string api_ticket, string card_id, string noncestr, string timestamp, out string string1) {
        List < string > ss = new List < string > () {
            api_ticket,
            timestamp,
            noncestr,
            card_id
        };
        var list = ss.OrderBy(x => x, StringComparer.Ordinal).ToArray();
        string1 = string.Join("", list);
        return SHA1(string1, Encoding.UTF8);
    }
    
    //SHA1解密
    public static string SHA1(string content, Encoding encode) {
        try {
            SHA1 sha1 = new SHA1CryptoServiceProvider();
            byte[] bytes_in = encode.GetBytes(content);
            byte[] bytes_out = sha1.ComputeHash(bytes_in);
            sha1.Dispose();
            string result = BitConverter.ToString(bytes_out);
            result = result.Replace("-", "");
            return result;
        } catch (Exception ex) {
            throw new Exception("SHA1加密出错:" + ex.Message);
        }
    }
    
    //将返回的参数传入wx.addCard接口即可
    wx.addCard({
      cardList: [
        {
          cardId: '',
          cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
        }, {
          cardId: '',
          cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
        }
      ],
      success (res) {
        console.log(res.cardList) // 卡券添加结果
      }
    })
    

    总结

    希望大家在完成卡券功能时都能迎刃而解~觉得有帮助的麻烦点个赞哈!

    展开全文
  • 微信卡券

    2019-06-16 04:31:45
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 微信卡券管理 - 修改卡券基本信息

    千次阅读 2019-09-04 16:19:17
    最近做到微信卡券,在报错相关的错误码时候,可以根据错误码来查找相关的错误,做一些记录 微信卡券文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025272 1,在修改卡券信息的时候根据...
  • 想要实现将微信卡券生产链接,在外部浏览器中点击此链接,可直接打开微信并显示公众号
  • 微信小程序与公众号卡券/会员打通

    万次阅读 2017-06-28 09:59:20
    微信小程序与公众号卡券/会员打通卡券开发:带你走出小程序的坑 tips:由于笔者也是一位前端菜鸟,所以尽量用简单直白的语言为大家讲解,如有说的不到位的地方,还望多多指教 - 作为小程序的研发人员已经默默在小...
  • 坐拥7.5亿月活用户的微信,连接线下是必然选择,也是微信生态从纯粹通讯工具、游戏发布、朋友圈社交,再到微信红包、微信支付之后,建立商业闭环的重要途径。但是这条路并不好走,有美团、口碑、支付宝等同业的竞争...
  • 微信卡券领取页面提示签名错误

    千次阅读 2018-10-16 15:19:30
    微信卡券领取页面提示签名错误,微信卡券JSAPI签名校验工具对比签名一模一样,cardExt扩展字段有问题 一、领券页面错误 二、给到前端的数据 三、根据给前端的额数据做签名校验 四、给前端的签名和校验的...
  • 微信小程序卡券开发步骤

    千次阅读 2017-11-02 16:46:46
    1,去公众平台,开通卡券,绑定小程序,申请公众平台 2,后台根据appid和秘钥获取ccess_token, 3,升级卡券 4,后台根据access_token获取openid 5,后台生成卡券签名 6,前台获取卡券
  • 今天做微信卡券 添加卡券一直报签名错误 参考了好多文档 理了下思路 希望对遇到这问题的人有帮助。另外 本人小白一名,代码有不规范的地方,请大神勿喷。 第一 要确认signature正确 生成的签名跟微信提供的调试...
  • 微信小程序添加卡券,领取到卡包

    万次阅读 2019-06-04 14:35:28
    微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 小程序实现代码: onLoad: function(option) { wx.addCard({ cardList: [{ "cardExt": '{"nonce_str":"42a34c6e84334c69961f5294643ad...
  • 微信卡券开发

    万次阅读 2015-03-12 15:03:41
    浅谈微信卡券功能开发(3) 摘要: 闲扯&回顾 由于过年回来事情比较多,所以断了一段时间。今天赶紧接着。之前我们介绍完了卡券从创建到发放的基本流程,今天我们将介绍卡券和Code的相关操作。本文主要介绍...
  • 微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中。...微信支付、微信红包、微信卡券、微信小店。 源码地址 点击阅读   更多java,java学习,java面试题 http://techfoxbbs.com
  • 微信公众平台卡券功能

    千次阅读 2014-10-21 10:57:50
    卡券功能,是公众平台向有投放卡券需求的公众号提供的推广、经营分析的整套解决方案,是“微信卡包”的重要组成部分,是连接商户与消费者的新渠道。  通过资质审核的商户,拥有卡券制作、管理、投放和数据分析的...
  • 微信卡券参数错误
  • 卡券功能的转赠 要怎么实现呢。。有没有经验的大神给点思路,单单调用分享,和添加到卡包,会显示卡券已被领取完。。微信好像也没有提供 将卡券从会员那里回收的功能。。
  • 微信卡券开发流程

    千次阅读 2015-06-03 09:50:34
    卡券开发流程 本文只提供卡券开发的流程和思路,不说明具体接口。 第一,上传logo头像。(具体接口看微信开发文档) 第二,创建卡券,创建卡券需要用到logo头像(具体接口看微信开发文档) 第三,...
  • 值得注意的一点是,微信小程序关联的微信公众号里面如果没有开通卡券功能,需要去微信公众平台左侧菜单栏里面的”添加功能插件“里面找到并添加”卡券功能“才行。具体的小程序申请优惠券的步骤如下所示。 一、打开...
1 2 3 4 5 ... 20
收藏数 2,204
精华内容 881
关键字:

微信卡券