微信小程序卡券领取 java开发

当时在写微信小程序卡券的时候,当时微信后台都没有接触过,对接微信后台也没学过。关于微信小程序卡券的开发教程也看过不少,看的都是一脸懵逼。关键是开发微信卡券的过程,其中的代码并不难,一开始用php写了一个版本,但是之前的后台是java所以又写了一个java版本。

关于卡券对于商家的营销还是很重要的,主要为大家讲解一下微信小程序卡券的准备工作,以及主要流程和当时开发时遇到的错误示范。

关于准备工作,关键还是要先看官方给的开发文档。
https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1490190158&version=1&lang=zh_CN&platform=2
是关于小程序&卡券打通的官网文档教程。

下面主要还是将关于小程序里面的卡券领取过程

准备材料:
微信公众号:APPID 和 appSecret 微信开通卡券功能,手动在后台创建一个卡券获取card_id

官网返回码说明:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433747234

第一步:获取token(很多步骤都需要)
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
将里面的APPID和APPSECRET替换为自己公众号准备的材料里面。
这里写图片描述
返回的是这种JSON格式的,一定要填写正确的,返回码错误的话看上面官网返回码说明文档。
下面是获取token的部分代码

String url = ACCECC_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);
            JSONObject jsonObject = doGetStr(url);  //调用get方法
            if (jsonObject != null) 
token = jsonObject.getString("access_token")); //获取得到的token 

第二步:获取 api_ticket
卡券 api_ticket 是用于调用卡券相关接口的临时票据
用第一步拿到的token值,采用get请求方式获得卡券api_ticket地址接口
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
部分代码,和上面获取token的代码类似

String url = API_TICKET.replace("ACCESS_TOKEN",Open_Id.getToken());
            JSONObject jsonObject = doGetStr(url);
            if(jsonObject != null)
                  api_ticket = jsonObject.getString("ticket"));

这个是官方的开发文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115在附录4:卡券扩展字段及签名生成算法

第三步:加密算法signature
首先获取时间戳timestamp:注意用System.currentTimeMillis()获取的是毫秒,加密要求的是秒,要除以1000才可以

/**
     * 获取时间戳
     * @return
     */
    public String timestamp(){
        String time = String.valueOf(System.currentTimeMillis()/1000);   //获取一个时间戳 转换为String类型
        return time;
    }

随机字符串nonce_str:自己随便写一个随机字符串就可以了

/**
 * Created by hubo on 2017/11/7
 * 随机字符串
 */
public class Accessnonce_str {
    private final static String string = "0123456789";
    final private static char[] chars =  string.toCharArray();

    public String nonce_str(){
        String nonce = new String();
        for(int i=0; i<10; i++){
            int rannum = (int)(Math.random()*1000) % (chars.length);
            nonce += chars[rannum];
        }
        return nonce;
    }
}

将获取的api_ticket,timestamp,nonce_str,card_id(这个我是在微信后台手动创建获取的)
加密算法主要是字典序,然后将这些参数字符串拼接成为一个字符串,之后进行Sha1加密
加密算法代码

/**
 * Created by hubo on 2017/11/7
 * 加密signature
 */
public class WeixinSignature {
    private  String api_ticket;
    private  String timestamp;
    private  String card_id;
    private  String nonce_str;

    public WeixinSignature(String api_ticket, String timestamp, String card_id, String nonce_str){
        this.api_ticket = api_ticket;
        this.timestamp = timestamp;
        this.card_id = card_id;
        this.nonce_str = nonce_str;
    }

    /**
     * 加密参数
     * @return
     */
    public String sign(){

        String[] str = {api_ticket,timestamp,card_id,nonce_str};
        Arrays.sort(str);
        String string = new String();
        for(int i=0; i<4; i++){
            string += str[i];
        }
        String signature = null;    //加密结果
        signature = CheckUtil.getSha1(string);  //Sha1加密
        return signature;
    }

}

下面是Sha1加密算法代码

 //Sha1加密
    public static String getSha1(String str){
        if(str==null||str.length()==0){
            return null;
        }
        char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9',
                'a','b','c','d','e','f'};
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            mdTemp.update(str.getBytes("UTF-8"));

            byte[] md = mdTemp.digest();
            int j = md.length;
            char buf[] = new char[j*2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(buf);
        } catch (Exception e) {
            // TODO: handle exception
            return null;
        }
    }

加密signature官方提供的检验地址
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign
自己看加密的结果和官网给返回的结果比较
第四步:微信小程序领取卡券
代码部分

wx.request({
      url: 'http://访问返回数据的地址',
      data: {
        card: card
      },
      method: 'GET', 
      success: function (res) {
        var res = res.data;
        console.log(res);
        var card = res.card_id;
        var timestamp = res.timestamp;
        var signature = res.signature;
        var nonceStr = res.nonce_str;
        wx.addCard({
          cardList: [
            {
              cardId: card,
              cardExt: '{"code": "", "openid": "", "timestamp": ' + timestamp + ', "signature":"' + signature + '","nonce_str": ' + nonceStr+'}'
            }
          ],  
}

访问返回数据就是返回card_id,timestamp,signature,nonceStr我获取的是这四个
这里获得的timestamp,nonceStr这两个必须是signature加密里面的两个,不然领取卡券的时候会出现签名错误

还有一个非常注意的地方:在获取cardExt 需进行 JSON 序列化为字符串传入
不要直接传入对象,这个地方卡了我一星期,因为之前签名加密的数据步骤什么的都对,但是一领取就是签名错误这个原因,之后看了很多遍开发文档,关键是java后段返回的数据是对象类型,一定要转换为字符串类型,不然领取的时候还是签名错误。

java后段返回参数代码:返回的是JSON对象

WeixinSignature signature = new WeixinSignature(Open_Id.getApiTicket(),Open_Id.getTime(), Card_Id.getCardid(),nonce);   //获取signature

        PrintWriter out = resp.getWriter(); //返回网页请求的数据
        JSONObject jsonObject = new JSONObject();   //返回JSON格式数据
        //jsonObject.put("apitick",Open_Id.getApiTicket());

//        System.out.println("时间:"+Open_Id.getTime());
//        System.out.println("随机串:"+nonce);
//        System.out.println("加密字符:"+signature.sign());   
//        System.out.println("cardid:"+Card_Id.getCardid());

        jsonObject.put("timestamp", Open_Id.getTime());
        jsonObject.put("nonce_str", nonce);
        jsonObject.put("signature",signature.sign());
        jsonObject.put("card_id",Card_Id.getCardid());
        out.print(jsonObject.toString());

这里写图片描述
这个是我获取的四个参数,获取参数后转换为字符串类型,不然会出现签名错误。

获取这四个参数后调用微信小程序的卡券领取
https://mp.weixin.qq.com/debug/wxadoc/dev/api/card.html
我主要是通过这四个步骤做好的微信小程序卡券领取功能,其余的功能就需要扩展开发了。

自己也是小白,开发过程也没多复杂的,主要是领取卡券的过程步骤还有一些细节我都写下了,由于写完之后又添加了许多功能,代码也就传了一部分。
有可能还有什么没写上去的,可以加qq交流下。

猜你喜欢

转载自blog.csdn.net/qq_1290259791/article/details/78559746
今日推荐