卡券_卡券 设置跟随推荐接口 - CSDN
精华内容
参与话题
  • 小程序卡券开发

    千次阅读 2019-03-04 12:20:32
    1.在小程序中支付成功后获得一张卡券 2.用户凭卡券在店内核销 根据以上需求,折腾了我好几天(客户一直忙照顾店里生意,扫个码都要等两天)。 首先客户提供了微信公众号的账号密码给我。我登录进去,也把自己添加...

    客户的要求如下:

    1.在小程序中支付成功后获得一张卡券

    2.用户凭卡券在店内核销

    根据以上需求,折腾了我好几天(客户一直忙照顾店里生意,扫个码都要等两天)。

    首先客户提供了微信公众号的账号密码给我。我登录进去,也把自己添加为运营者了。

    首先声明我这里不是用接口创建卡券的

    然后在左侧选择添加功能插件,当然客户是已经完成商户号、小程序和公众号的认证。

    找到下面这个功能插件

    点进去首先是应该提交商户信息,因为我的已经提交了所以没有办法截图了,这也没什么难点。提交之后会在3个工作日内审核。

    审核通过之后左侧栏就有卡券功能了。点击进入。

    注意上方的右侧有一个代制模式或者自制模式,我们选择自制模式。

    然后选择“优惠券”。

    点击在下方的新建优惠券。然后让你选择券的类型。按我客户的需求,我选择兑换券。

    然后填入参数,注意他有个个人领取数量限制和一个库存量。填完之后提交审核,然后秒通过。

    然后回到“优惠券”那里就会像我的一样多了一行,我们还可以对其进行修改。

    我们先点详情,获取卡号

    拿到卡号存好。接下来我们要获取公众号开发的权限。

    在左侧的最底下

    存好appid和秘钥(需要管理员扫码)

    然后注意我们还要添加IP白名单,不然是获取不到token的。我们先把自己的服务器的IP(注意是IP不是域名)加进去,然后再把本地开发的IP加进去,当然本地的IP我们现在可能还不知道(并不是192.168什么的,是公网IP)。没关系,先保存。

    以上操作都是在公众平台上面的,现在我们回到代码开发。我们理一下卡券从生成到核销的整个过程:

    我们先获取公众号的token(不是小程序的),然后用这个token获得ticket,然后用ticket去加密获取签名,得到签名之后发送给前端,前端调用wx.addCard()方法来进入一个领取页面,然后用户点击领取之后前端会获得一个加密过的code,让前端把code发送给我们,我们拿到code之后再发送请求到微信服务器去解密,解密后拿到真实的code(就是卡券上面那个号码),当用户拿着卡券到店里核销的时候,相当于把code告诉我们,我们根据code去查到这个订单的内容,然后发起核销请求到微信服务器。

    1.数据准备,我们先准备一个用来接收返回结果的实体(getset省写)

    public class XcxJson {
    
       String session_key;
       String openid;// 小程序的openid
       String access_token;// 小程序或公众号的token
       String ticket;//卡券
       String expires_in;//有效时间:秒
       String code;//卡券的code
    
       Integer errcode;//错误码
       String errmsg;//错误信息
    
    }

    2.编写获取token的方法(JSON用的是阿里巴巴的FastJson)

    /**
     * 获取公众号的token
     * @param appid   公众号的appid
     * @param secret  公众号的秘钥
     *
     * @return
     */
    static public String selectToken(String appid, String secret) {
       HttpRequestor requestor = new HttpRequestor();
       Map<String, String> map = new HashMap<String, String>();
       map.put("grant_type", "client_credential");
       map.put("appid", appid);
       map.put("secret", secret);
       String res = null;
       String token = "error";
       String url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";
       url+="&appid="+appid;
       url+="&secret="+secret;
       try {
          res = requestor.doGet(url);
          System.out.println(res);
          XcxJson json = JSON.parseObject(res, XcxJson.class);
          token = json.getAccess_token();
       } catch (Exception e) {
          e.printStackTrace();
       }
       return token;
    }

    3.编写获取ticket的方法(JSON用的是阿里巴巴的FastJson)

    /**
     * 获取公众号的ticket
     * @param token  公众号的token
     *
     * @return error-获取失败
     */
    static public String selectTicket(String token) {
       String ticket ="error";
       try {
          String res = HttpRequestor.doGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+token+"&type=wx_card");
          System.out.println(res);
          XcxJson json = JSON.parseObject(res, XcxJson.class);
          if(json.getErrcode()==0){
             ticket = json.getTicket();
          }
       } catch (Exception e) {
          e.printStackTrace();
       }
       return ticket;
    }
    

    4.有了ticket之后,我们提供给前端小程序card_id、timestamp、nonce_str、signature。当然如果需要指定领取用户就让前端先发openid过来。然后我们要计算signature。下面是我用java.util.UUID随机生成nonce_str,然后时间戳要除以1000,之后用nonce_str、ticket、timestamp、card_id计算签名,当然我这里是限定了领取用户的,所以加了openid,如果不需要,请把所有openid都去掉。

    public JSONObject select(String openid) {
       String token = xcxService.getGzhToken("gzh_token");
       String ticket =xcxService.getTicket("gzh_ticket",token);
       Long timestamp = System.currentTimeMillis()/1000;
       String card_id="";
       String noncestr = UUID.randomUUID().toString().replaceAll("-","");
       String sign = getSignature(noncestr,ticket,timestamp,card_id,openid);
       JSONObject object = new JSONObject();
       object.put("noncestr",noncestr);
       object.put("timestamp",timestamp);
       object.put("sign",sign);
       object.put("card_id",card_id);
       return object;
    }

    5.生成签名必须先将值进行排序然后拼接在一起,最后用SHA1加密。生成签名之后连其他参数应该传给前端

    /**
     * 生成加密签名,用于微信卡券
     * @param noncestr   随机字符串
     * @param jsapi_ticket   小程序ticket
     * @param timestamp   时间戳
     * @param card_id   卡券ID
     * @param openid 领券用户的Openid
     * @return
     */
    public  String getSignature(String noncestr,String jsapi_ticket,Long timestamp,String card_id,String openid){
       List<String> params=new ArrayList<String>();
       params.add(jsapi_ticket);
       params.add(timestamp+"");
       params.add(noncestr);
       params.add(card_id);
       params.add(openid);
       Collections.sort(params);
       String sign = "";
       for(String str:params){
          sign+=str;
       }
       // System.out.println(sign);
       String sha = org.apache.commons.codec.digest.DigestUtils.sha1Hex(sign);
       return sha;
    }

    6.前端拿到这几个参数之后调用wx.addCard()方法,如下(openid没有返回去,因为本身openid就是前端给我的),

    注意cardExt是经过JSON.stringify() 转成字符串的。还有加密时和这里的参数必须对应上,除了ticket以外,所有加密时的参数都必须在这里对应上,不能多也不能少,card_id单独拿出来。可以在https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign验证你的签名是不是算对了。这里很容易出现签名错误的问题。只要确保token和ticket都是用公众号的、加密没有错,参数对应得上、cardExt转json字符串,就不会签名出错。

    var card = {

         cardId: res.data.data.card_id,

         cardExt: JSON.stringify({

           openid:globalData.openid,

           timestamp: res.data.data.timestamp,

           nonce_str: res.data.data.noncestr,

           signature: res.data.data.sign

         })

    }

    wx.addCard({

       cardList: [card],

       success: res => {

            console.log(res);

       }

    })

    7.在上面小程序代码中,我们只打印了领取结果res。如果领取成功了,我们需要前端把res.cardList[0].code发给服务器,当然最好带上其他参数,比如我还需要带上订单ID,否则都不知道这个code属于哪单。

    后端拿到code之后用下面的方法进行解码

    /**
     * 解码卡券领取后获得的code
     * @param code 前端传回来的code
     * @param token 公众号的token
     * @return
     */
    public static String decode(String code,String token){
       String url = "https://api.weixin.qq.com/card/code/decrypt?access_token="+token;
       JSONObject object = new JSONObject();
       object.put("encrypt_code",code);
       String res = HttpRequestor.postJson(url,object.toJSONString());
       XcxJson json = JSON.parseObject(res,XcxJson.class);
       if(json.getErrcode()==0){
          return json.getCode();
       }else{
          return "error";
       }
    }

    8.解码之后保存好code,并把code绑定到相关的数据库表中,方便下次查。当用户要核销卡券的时候,

    扫码枪扫出来的或者用户展示的code和我们存的code 是一直的,我们把相关的东西展示到前台,然后执行核销(最好让前台员工确认后)。

    /**
     * 核销卡券
     * @param code 卡券的code
     * @param card_id 卡券的ID
     * @param token 公众号的token
     *
     * @return 0-失败,1-成功
     */
    public static Integer cancel(String code,String card_id,String token){
       String url = "https://api.weixin.qq.com/card/code/consume?access_token="+token;
       JSONObject object = new JSONObject();
       object.put("code",code);
       object.put("card_id",card_id);
       String res = HttpRequestor.postJson(url,object.toJSONString());
       XcxJson json = JSON.parseObject(res,XcxJson.class);
       if(json.getErrcode()==0){
          return 1;
       }else{
          return 0;
       }
    }

    核销完之后卡包里面的卡券就会变成已使用。这样我们的整个逻辑链就完整了。

    我这里主要讲的是在公众平台生成的卡券,如果需要自定义程度高的卡券,则需要调用创建卡券的接口。然后投放和核销会多一些参数。

    展开全文
  • 微信小程序与卡券功能小结

    千次阅读 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) // 卡券添加结果
      }
    })
    

    总结

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

    展开全文
  • .Net C# 小程序卡券demo

    2020-07-30 13:26:54
    其中相信做小程序卡券遇到最多的应该是“签名错误”。完全按照文档来还是签名错误!生成的签名与签名校验工具一致还是签名错误。。。各种各样的坑搞到焦头烂额,所以我弄好后,写了一个可正常执行的demo,你们可以...
  • 促销#卡券系统整理

    千次阅读 2015-03-30 23:36:19
    最近密集调查和学习了卡券系统的业务规则和技术分析,这篇文章的记下了个人对卡券系统各方面的思考、总结和资料整理。 一、为什么会存在卡券系统,卡券系统的价值? 卡券系统是运营促销的必备工具,无论是在电商类...

    最近密集调查和学习了卡券系统的业务规则和技术分析,这篇文章的记下了个人对卡券系统各方面的思考、总结和资料整理。

    一、为什么会存在卡券系统,卡券系统的价值?

    卡券系统是运营促销的必备工具,无论是在电商类企业还是在其它各行各业都会看到卡券系统的影子。我是从以下几个角度去理解卡券的:

    • 从运营促销的角度
    • 从增强用户黏性、客户关怀的角度
    • 从精准营销的角度
    • 从市场营销的角度

    从不同的角度去理解卡券就会得到卡券重要的价值。

    二、基本业务规则

    1.卡券预算

    发行卡券是要有预算一般是需要财务介入的,最后是需要进行成本核算的。

    2.卡券常规特征分类

    2.1.基本类

    卡券名称、使用说明、有效期、面值、类别、唯一标识、业务线标识、卡券状态

    2.2.扩展类

    电子券、实物卡、较验码、使用限额、使用范围(限品类、品牌、商铺、活动、限终端、自定义范围)、使用策略(可以理解为对使用范围的扩展)

    2.3.管理类

    卡券费用分摊、批次标识、计划发放数量、卡券发放渠道

    3.卡券的业务类别

    3.1.代金券

    3.2.优惠券

    3.3.运费券

    3.4.兑换券

    3.5.满减券

    3.6.满返券

    3.7.满赠券

    3.8.折扣券

    3.9.实物储值卡

    3.10.多倍积分卡或券

    3.11.自定义专享券

    3.11.1.新用户专享

    3.11.2.vip专享

    3.11.3.生日专享

    3.11.4.支付方式专享

    4.卡券的使用规则

    卡券使用规则一般分如成几类,以下场景是单次购买行为(单个订单)

    4.1.同一类别的卡券不可累加使用

    4.2.卡券面值大于订单需支付金额

    4.3.卡券与其它优惠方式并存

    4.4.卡券金额不退

    4.5.卡券使用范围限制

    4.6.卡券特例品不能使用

    5.卡券领用、发放规则

    5.1.复合特定规则的用户

    5.2.补全联系方式的用户

    5.3.每用户限领一张

    5.4.参与推广用户可多次领取每次一张)

    三、技术分析和实现

    1.总体结构

    1.1.卡券服务,负责封装卡券内在逻辑,对外暴露统一api

    1.2.订单服务,是卡券的消费者,参与选择并执行具体类别的卡券使用策略,负责联通支付系统。

    1.3.领券服务,负责实现领券与卡券系统的分离,应对外在各种不确认因素。

    2.涉及到的关系

    2.1.用户

    2.1.1.用户需要知道自己所持有的卡券

    2.1.2.用户需要对自己的卡券进行操作(如延期申请、转赠)

    2.1.3.用户通过多种渠道获取卡券(具体情况依实际情况而定)

    2.1.4.用户下单订单结算时使用卡券

    2.1.5.用户取消订单卡券退还,相应实际支付金额退还给用户

    2.2.商家

    2.2.1.商家结算时依据实际订单金额为准

    2.2.2.商家结算时需要处理促销费用分摊

    2.3.卡券使用规则

    2.3.1.卡券限额

    2.3.2.卡券限品牌

    2.3.3.卡券限品类

    2.3.4.卡券满减、满赠

    2.3.5.卡券抵扣规则

    2.4.卡券发放、邻取规则

    2.4.1.依据促销策略实现发放

    2.4.2.控制单用户领取数量

    2.4.3.分享多次可领多次

    2.5.平台

    2.5.1.使用卡券支付的订单结算

    2.5.2.使用卡券支付的订单退款

    2.5.3.卡券财务核算

    3.关注非功能需求

    3.1.大规则领券对服务器的影响

    3.2.考虑异步化分担负载

    3.3.考虑分布式缓存分担负载

    3.4.考虑恶意攻击

    3.5.重点关注的几个点

    3.5.1.订单结算页使用卡券

    3.5.2.卡券多规则计算并查询

    3.5.3.卡券异步化后状态的同步

    3.6.考虑作弊


    展开全文
  • 微信小程序——卡券

    千次阅读 2018-08-03 09:27:43
    代码: 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 29 30 // addCard app.func.req('获取Signature的Url', {}, function (res) { ... wx.addCar...

    代码:

    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
    29
    30
    
    // addCard
    app.func.req('获取Signature的Url', {}, function (res) {
      if (res.State) {
        wx.addCard({
          cardList: [
            {
              cardId: '微信公众平台申请的会员卡的Id',
              cardExt: '{
              "code": "", 
              "openid": "", 
              "timestamp": ' + res.Timestamp + ', 
              "signature":"' + res.ExtSign + '",
              "nonce_str":"' + res.Noncestr + '"
              }'
            } //cardExt中的参数全部来源于后台提供
          ],
          success: function (res) {
            // console.log('成功',res)
            app.func.req('解密卡券code', { uid:UserId, code: encodeURIComponent(res.cardList[0].code) }, function (res) {
              // console.log(res)
              //这里请求的接口是将用户获取到的code给后台存起来,openCard会用到
            })
          },
          fail:function(res){
            // console.log('失败',res)
    
          }
        })
      }
    })
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    // openCard
    app.func.req('通过用户的id获取到用户的code接口', { uid:UserId }, function (res) {
      if (res.State) {
        wx.openCard({
          cardList: [
            {
              cardId: '微信公众平台申请的会员卡的Id',
              code: res.Msg,//后台返回的用户code
            }
          ],
          complete: function (res) {
            // console.log(res)
          },
          success: function (res) {
            // console.log(res)
          }
        })
      }
    })

     

    更多详细说明请访问 这里

    展开全文
  • 微信卡券管理 - 修改卡券基本信息

    千次阅读 2019-09-04 16:19:17
    最近做到微信卡券,在报错相关的错误码时候,可以根据错误码来查找相关的错误,做一些记录 微信卡券文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025272 1,在修改卡券信息的时候根据...
  • 微信卡券的领取签名参照https://blog.csdn.net/SongJingzhou/article/details/105517841 package com.yzf.mall.services.support.wxpay.service.impl; import cn.hutool.core.lang.Dict; import ...
  • 文章目录说明卡券术语介绍卡券生命周期流程图准备申请开发账号公众平台开发配置公众号开发信息配置填写服务器配置并验证有效性申请微信认证及开通微信卡券功能卡券分类普通卡券会员卡券朋友的券特殊票券接口开发创建...
  • 促销#卡券系统基本设计

    千次阅读 2015-05-01 00:38:14
    整理卡券系统的分析设计,越发感悟到技术的存在是为业务服务的这句话,在这之前收集并认真学习了多个电商平台的卡券系统或功能,卡券系统是上层促销策略与底层促成交易生成有效订单的连接点,运营方面的各项策略最终...
  • 微信小程序卡券开发步骤

    千次阅读 2017-11-02 16:46:46
    1,去公众平台,开通卡券,绑定小程序,申请公众平台 2,后台根据appid和秘钥获取ccess_token, 3,升级卡券 4,后台根据access_token获取openid 5,后台生成卡券签名 6,前台获取卡券
  • 想要实现将微信卡券生产链接,在外部浏览器中点击此链接,可直接打开微信并显示公众号
  • 微信小程序与公众号卡券/会员打通

    万次阅读 2017-06-28 09:59:20
    微信小程序与公众号卡券/会员打通卡券开发:带你走出小程序的坑 tips:由于笔者也是一位前端菜鸟,所以尽量用简单直白的语言为大家讲解,如有说的不到位的地方,还望多多指教 - 作为小程序的研发人员已经默默在小...
  • 微信公众平台卡券功能

    千次阅读 2014-10-21 10:57:50
    卡券功能,是公众平台向有投放卡券需求的公众号提供的推广、经营分析的整套解决方案,是“微信卡包”的重要组成部分,是连接商户与消费者的新渠道。  通过资质审核的商户,拥有卡券制作、管理、投放和数据分析的...
  • 微信卡券开发错误自排查参考文档

    万次阅读 2015-07-22 15:49:33
    微信卡券开发错误自排查参考文档       目录 微信卡券开发者错误排查文档... 1 Part.1常见错误... 3 1.1接入指引... 3 1.2卡券创建... 4 1.3卡券投放... 5 1.4卡券核销... 8 Part.2常见疑问... ...
  • 微信卡券开发

    万次阅读 2015-03-12 15:03:41
    浅谈微信卡券功能开发(3) 摘要: 闲扯&回顾 由于过年回来事情比较多,所以断了一段时间。今天赶紧接着。之前我们介绍完了卡券从创建到发放的基本流程,今天我们将介绍卡券和Code的相关操作。本文主要介绍...
  • 微信卡券开发流程

    千次阅读 2015-06-03 09:50:34
    卡券开发流程 本文只提供卡券开发的流程和思路,不说明具体接口。 第一,上传logo头像。(具体接口看微信开发文档) 第二,创建卡券,创建卡券需要用到logo头像(具体接口看微信开发文档) 第三,...
  • 微信卡券参数错误
  • 浅谈微信卡券功能开发(3)

    千次阅读 2015-08-25 17:48:00
    回顾 之前我们介绍完了卡券从创建到发放的基本流程,今天我们将介绍卡券和Code的相关操作。本文主要介绍NodeJS语言下wechat-card模块的操作方式,另外对重要的地方进行特别说明,以便其他语言开发者参考。 卡券ID...
  • 浅谈微信卡券功能开发(2)

    千次阅读 2015-08-25 17:46:26
    回顾 继续介绍NODEJS开发微信卡券功能,昨天简单演示了微信接口的Access Token的原理和用法,还有门店的添加和查询,今天我们将介绍卡券的创建以及核销的最基本的流程。 本文将使用NodeJS作为开发语言,以wechat-...
  • 坐拥7.5亿月活用户的微信,连接线下是必然选择...但是这条路并不好走,有美团、口碑、支付宝等同业的竞争,也有微信生态闭环的用户习惯培养,同时也需要更好用户体验产品来推动,也许新美大卡券超市就是其中一种尝试。
1 2 3 4 5 ... 20
收藏数 3,068
精华内容 1,227
关键字:

卡券