说实话呢,这次微信会员卡的开发文档是真的乱,四分五裂,我也是东凑西拿的才完成会员卡的开发,把开发经验和踩坑给大家说一下,希望对大家有所帮助
开发出来是这个效果如下图:
直接上我写的接口吧;
- /createCard 会员卡开卡接口,创建模板也是在这个接口;
- /getopenid 获取微信用户传过来的code,通过code获取用户的唯一标识符openid;
- /wxgetcode 根据这个接口传来的值去匹配数据库数据返回给微信小程序数据;
- /getparam 这个接口是获取encrypt_card_id, outer_str, biz 三个参数(没有用到换方法了,用的是 wx.add方法,没有用navigateToMiniProgram这个,快废弃掉了);
- /signature 获取签名(根据时间戳timestamp,随机串nonce_str,模板card_id,生成签名要和微信文档签名一致);
签名校验地址:http://www.bejson.com/tools/weixinmpcardsign/ - /delcard1 删除会员卡(根据创建的模板card_id删除);
- /selectcardid 查询会员卡是否已领取过进行判断防止用户重复领卡;
- /sendcardid 用户领取完会员卡保存模板card_id,为查询会员卡做提供;
- updatedh 修改用户手机号(根据自己的业务可有可无);
这些接口差不多就可以完成会员卡开发流程,从开卡——到发卡——到卡包中
下面就上业务代码吧
- controller
package com.example.demo;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entities.CheckUtil;
import com.example.demo.entities.NDShenPi;
import com.example.demo.entities.wxuser;
import com.example.demo.service.sfrz;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import static com.example.demo.shenfenrz.decode;
/**
* @author : 宋银义
* @date : 2020-06-11 17:27
**/
@Controller
public class wxcard {
@Autowired
private sfrz sfrz;
/**公众号APPID*/
public static final String APPID = "xxx";
/**小程序APPID*/
public static final String APPID1 = "wx9472bxxx";
/**公众号AppSecret*/
public static final String AppSecret = "d9977bee1dxxx";
/**小程序AppSecret*/
public static final String AppSecret1 = "4d62c2ce155a929adc70xxx";
@GetMapping("/updatedh")
@ResponseBody
public HashMap<String, String> updatedh(String sfzh ,String xm,String shouji){
sfzh = new String(decode(sfzh));
shouji = new String(decode(shouji));
System.err.println("shouji:=="+shouji);
HashMap<String, String> map = new HashMap<>();
int i = sfrz.updatedh(sfzh,xm,shouji);
System.err.println("I:=="+i);
if (i>0){
map.put("success","true");
map.put("msg","修改成功");
}else {
map.put("success","false");
map.put("msg","修改失败");
}
return map;
}
@GetMapping("/sendcardid")
@ResponseBody
public HashMap<String, String> cardout(String openid,String sfzh ,String xm,String cardid){
sfzh = new String(decode(sfzh));
openid = new String(decode(openid));
cardid = new String(decode(cardid));
int i=sfrz.savecardid(openid,sfzh,xm,cardid);
HashMap<String, String> map = new HashMap<>();
if (i>0){
map.put("success","true");
map.put("msg","插入成功");
}else {
map.put("msg","插入失败");
}
return map;
}
@GetMapping("/selectcardid")
@ResponseBody
public HashMap<String, String> selectcardid(String openid,String sfzh ,String xm){
sfzh = new String(decode(sfzh));
openid = new String(decode(openid));
List<wxuser> list =sfrz.selectcardid(openid,sfzh,xm);
System.err.println("cardid"+list.get(0).getOpencardid());
HashMap<String, String> map = new HashMap<>();
if (list.size()!=0){
String opencardid = list.get(0).getOpencardid();
if (opencardid!=null &&opencardid!=""){
map.put("success","true");
map.put("msg","卡已领取");
}else {
map.put("success","false");
map.put("msg","可以领卡");
}
}else {
map.put("success","false");
map.put("msg","可以领卡");
}
return map;
}
@GetMapping("/delcard1")
@ResponseBody
public String delcard(String card_id){
String accessToken = getAccessToken();
String body="{\n" +
" \"card_id\": \""+card_id+"\"\n" +
"}";
JSONObject jsonObject = JSONObject.parseObject(body);
String url ="https://api.weixin.qq.com/card/delete?access_token="+accessToken;
String post = post(jsonObject, url);
return post;
}
@GetMapping("/getopenid")
@ResponseBody
public HashMap<String, String> getopenid(String code){
code = new String(decode(code));
String openid = getOpenid(code);
JSONObject jsonObject = JSONObject.parseObject(openid);
String openid1 = jsonObject.getString("openid");
System.err.println("openid1:=="+openid1);
int i = sfrz.getapp_id1(openid1);
System.err.println("i:=="+i);
HashMap<String, String> map = new HashMap<>();
if (i==0){
map.put("success","2");
map.put("openid",openid1);
}else if(i>0){
map.put("success","1");
List<wxuser> list = sfrz.selectopenid(openid1);
if (list.size()!=0){
System.err.println("getName"+list.get(0).getName());
NDShenPi ndShenPi = sfrz.getselect(list.get(0).getSfzh(),list.get(0).getName());
if (ndShenPi != null) {
map.put("id", String.valueOf(ndShenPi.getId()));
map.put("BillNo", ndShenPi.getBillNo());
map.put("OID", String.valueOf(ndShenPi.getOID()));
map.put("ShiXiangMingCheng", ndShenPi.getShiXiangMingCheng());
map.put("ShiXiangLeiXing", ndShenPi.getShiXiangLeiXing());
map.put("ShouLiShiXian", ndShenPi.getShouLiShiXian());
map.put("ShiXiangBianMa", ndShenPi.getShiXiangBianMa());
map.put("ShouLiBuMen", ndShenPi.getShouLiBuMen());
map.put("ShouLiChuangKou", ndShenPi.getShouLiChuangKou());
map.put("ShouLiShiJian", ndShenPi.getShouLiShiJian());
map.put("ShenQingRen", ndShenPi.getShenQingRen());
map.put("ShenQingRenEN", ndShenPi.getShenQingRenEN());
map.put("ZhengJianType", ndShenPi.getZhengJianType());
map.put("ZhengJianHao", ndShenPi.getZhengJianHao());
map.put("Img", ndShenPi.getImg());
map.put("ShengRi", ndShenPi.getShengRi());
map.put("XingBie", ndShenPi.getXingBie());
map.put("MinZu", ndShenPi.getMinZu());
map.put("GuoJia", ndShenPi.getGuoJia());
map.put("HuKouSuoZaiDi", ndShenPi.getHuKouSuoZaiDi());
map.put("XueLi", ndShenPi.getXueLi());
map.put("XueLiQuanRiZhi", ndShenPi.getXueLiQuanRiZhi());
map.put("QuanRiZhiZhuanYe", ndShenPi.getQuanRiZhiZhuanYe());
map.put("HaiWai", ndShenPi.getHaiWai());
map.put("XueLiZaiZhi", ndShenPi.getXueLiZaiZhi());
map.put("ZaiZhiZhuanYe", ndShenPi.getZaiZhiZhuanYe());
map.put("RenCaiLeiBie", ndShenPi.getRenCaiLeiBie());
map.put("RenCaiChengHao", ndShenPi.getRenCaiChengHao());
map.put("BiYeZhengShuBH", ndShenPi.getBiYeZhengShuBH());
map.put("YJTime", ndShenPi.getYJTime());
map.put("YouXiang", ndShenPi.getYouXiang());
map.put("DianHua", ndShenPi.getDianHua());
map.put("ShouJi", ndShenPi.getShouJi());
map.put("YuanDanWei", ndShenPi.getYuanDanWei());
map.put("YuanZhiCheng", ndShenPi.getYuanZhiCheng());
map.put("YinJinLeiXing", ndShenPi.getYinJinLeiXing());
map.put("QianYueQiXian", ndShenPi.getQianYueQiXian());
map.put("ZhiCheng", ndShenPi.getZhiCheng());
map.put("DanWei", ndShenPi.getDanWei());
map.put("DiZhiQu", ndShenPi.getDiZhiQu());
map.put("DiZhi", ndShenPi.getDiZhi());
map.put("HangYe", ndShenPi.getHangYe());
map.put("XingZhi", ndShenPi.getXingZhi());
map.put("ShengZhi", ndShenPi.getShengZhi());
map.put("FaRen", ndShenPi.getFaRen());
map.put("LianXiRen", ndShenPi.getLianXiRen());
map.put("LianXiDianHua", ndShenPi.getLianXiDianHua());
map.put("GZShiJian", ndShenPi.getGZShiJian());
map.put("GZGongZuo", ndShenPi.getGZGongZuo());
map.put("GZZhiWu", ndShenPi.getGZZhiWu());
map.put("JLMingCheng", ndShenPi.getJLMingCheng());
map.put("JLShiJian", ndShenPi.getJLShiJian());
map.put("JLBuMen", ndShenPi.getJLBuMen());
map.put("QXingMing", ndShenPi.getQXingMing