• 简书网微信公众号二维码
您当前的位置: 首页 > 知识百科 > java微信卡劵开发?如何开发?

java微信卡劵开发?如何开发?

时间:2023-07-01 14:05 阅读数:13 人阅读 分类:知识百科

  java微信卡劵开发?如何开发?我们在日常生活中经常会得到微信卡券,但是你知道微信卡券怎样开发嘛?你知道java怎样开发微信卡券嘛?最近很多微信用户问我java微信卡劵开发?如何开发?下面小编就带你了解一下java微信卡劵开发?如何开发?

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

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

  关于准备工作,关键还是要先看官方给的开发文档。

  mp.weixin.qq/cgi-bin/announce?action=getannouncement&key=1490190158&version=1&lang=zh_CN&platform=2

  是关于小程序&卡券打通的官网文档教程。

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

  准备材料:

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

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

  第一步:获取token(很多步骤都需要)

  api.weixin.qq/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地址接口

  api.weixin.qq/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"));

  这个是官方的开发文档mp.weixin.qq/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加密算法代码

  //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官方提供的检验地址

  mp.weixin.qq/debug/cgi-bin/sandbox?t=cardsign

  自己看加密的结果和官网给返回的结果比较

  第四步:微信小程序领取卡券

  代码部分

  wx.request({

  url: '访问返回数据的地址',

  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());

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

  获取这四个参数后调用微信小程序的卡券领取

  mp.weixin.qq/debug/wxadoc/dev/api/card.html

  我主要是通过这四个步骤做好的微信小程序卡券领取功能,其余的功能就需要扩展开发了。

  java微信卡劵开发?如何开发?通过小编以上的内容,你知道java微信卡劵开发?如何开发了吗?希望小编的内容对你有所帮助,如果需要了解更多信息,请关注微微风。

  推荐阅读:

  微信卡包票劵如何分享给好友?

  微信卡包优惠劵怎么用?使用方法?

  微信卡包怎样制作会员卡?