微信小程序领取会员卡流程整理java 端
1.创建卡券,会员卡或者优惠券
创建微信卡券
一般来说会员卡都是自定义的卡券code所以你需要确保你会员卡号不能重复
优惠券一般无需自定义卡券code,看自己需求
2.获取开卡参数给前端
//前端给用户的唯一标识,openid或者unid,卡券code。这个看自己的业务场景.
public Res getCardInfo(String openid) {
String cardId =“”;
String apiticket = tokenService.getLsapiTicket();
log.info("apiticket" + apiticket);
String nonceStr = tokenService.getNonceStr();
String timeStamp = tokenService.getTimeStamp();
String sign = tokenService.getSigncard(apiticket,one.getCustomerNumber(), timeStamp, cardId, nonceStr);
Map<String, String> map = new HashMap<>();
map.put("nonce_str", nonceStr);
map.put("timestamp", timeStamp);
map.put("signature", sign);
map.put("cardId", cardId);
map.put("api_ticket", apiticket);
map.put("code", "自己看需要是不是自定义的code,是,就自己生成,不是不给");
log.info("返回的领卡信息 " + map.toString());
return new Res(map);
}
/**
* 获取ticket
*
* @return
*/
public String getLsapiTicket() {
String api_ticket = null;
try {
api_ticket = (String) redisTemplate.opsForValue().get("getapiTicket");
} catch (Exception e) {
log.info("redis未获取到 getapiTicket");
}
if (StringUtils.isEmpty(api_ticket)) {
String requestUrl = "";
String s = HttpUtil.get(requestUrl);
ApiTicketVO apiTicket = JsonUtil.transferJsonToObject(s, ApiTicketVO.class);
// ApiTicket apiTicket = JSON.parseObject(s, ApiTicket.class);
api_ticket = apiTicket.getApiTicket();
log.info(apiTicket.getUpdateTime()+"");
log.info( System.currentTimeMillis()+"");
redisTemplate.opsForValue().set("getapiTicket", api_ticket,7200-parseDate(apiTicket.getUpdateTime()), TimeUnit.SECONDS);
log.info("--getapiTicket--"+redisTemplate.opsForValue().get("getapiTicket"));
return api_ticket;
}
log.info("--getapiTicket-redisTemplate-"+api_ticket);
return api_ticket;
}
//这三个是固定的工具方法
public String getNonceStr() {
StringBuffer uuidSbBuffer = new StringBuffer();
int quotient = 1;
for (int i = 0; i < quotient; i++) {
uuidSbBuffer.append(UUID.randomUUID().toString().replaceAll("-", ""));
}
uuidSbBuffer.append(UUID.randomUUID().toString().replaceAll("-", "").substring(0, 1));
return uuidSbBuffer.toString();
}
public String getTimeStamp() {
return String.valueOf(System.currentTimeMillis() / 1000);
}
public String getSigncard(String api_ticket,String code, String timestamp, String card_id, String nonce_str) {
String[] sign = {api_ticket,code, timestamp, card_id, nonce_str};
Arrays.sort(sign);
String signStr = "";
for (String s : sign) {
signStr += s;
}
log.info("未加密的sign " + Arrays.toString(sign));
return sha1Encode(signStr);
}
3.前端在拿到开卡参数后,用户点击领取卡券。跳转到领卡页面,用户领卡会触发回调通知,
3.1.后台直接监听这个回调,判断用户领卡状态
/**
* 用户领卡后的微信回调
*
* @param
*/
@GetMapping("/getCardWechatRes")
public String getCardWechatRes(@RequestParam("eventType") String eventType,
@RequestParam("openId") String openId,
@RequestParam("code") String code,
@RequestParam("cardId") String cardId) {
log.info("微信领卡回调=======getCardWechatRes=============== start--");
log.info("=======getCardWechatRes=============== eventType--"+eventType);
log.info("=======getCardWechatRes=============== openId---"+openId);
log.info("=======getCardWechatRes=============== code---"+code);
log.info("=======getCardWechatRes=============== cardId--"+cardId);
//处理微信回调xml包
if ("user_get_card".equals(eventType)&&!StringObjIsNull(openId)&&!StringObjIsNull(code)&&!StringObjIsNull(cardId)){
//自己判断cardId是不是你生成的卡券cardId,然后处理业务修改会员领卡状态
}
if ("user_consume_card".equals(eventType)){
//核销卡卷
log.info("卡卷核销成功 ------------ " + code);
}
return "success";
}
//生成 会员卡code 自己加同步或者加锁保证卡号不重复
public String getCustomerNumber(){
String customerNumber = redisTemplate.opsForValue().get("customerNumber")+"";
if(StringObjIsNull(customerNumber)||"null".equals(customerNumber)){
//去数据库取最大的卡号
customerNumber = memberUserInfoMapper.getCustomerNumber().replace("huiyuanka","");
}
long aa = Long.parseLong(customerNumber)+1;
redisTemplate.opsForValue().set("customerNumber",aa+"");
return "huiyuanka"+aa;
}
结束