
现在许多线下市肆都开通了小程序,,,,,,并实现了优惠券接入,,,,,,来吸引人流,,,,,,那么关于开发新人来说,,,,,,怎样接入优惠券功效,,,,,,下面为各人介绍。。。。。。
一、开发前准备
1:申请微信公众号 和 微信小程序,,,,,,这是两个差别的工具,,,,,,都需要单独申请、差别的帐号;
2:微信公众号需要开通微信卡券的功效;
3:在微信公众号内里去绑定小程序;

4:申请微信开放平台,,,,,,并将微信公众号 和 微信小程序绑定到该开放平台。。。。。。(注:绑定到开发平台下的作用只是为了获取unionid,,,,,,由于统一用户在 公众号 和 小程序下获得的openid是纷歧样的,,,,,,若是公众号 和 小程序都需要领取卡券,,,,,,则最好通过unionid来跟踪用户;若是你只是开发微信小程序的领取卡券,,,,,,则完全可以忽略第4点,,,,,,博主自己也没有去绑定到微信开放平台,,,,,,感受方法好多,,,,,,特殊贫困!)
二、最先开发
1:获取微信卡券
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025272
这边可以直接通过微信公众号提供的接口获取或者建设微信的卡券,,,,,,此处不过多介绍,,,,,,只是提一下这边要获取的access_token,,,,,,网址如下https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183,,,,,,代码直接如下:
private static String grantType = "client_credential";
public static String appId = ""; //微信公众号appid
public static String secret = ""; //微信公众号密钥
public static AccessToken token = null; //微信公众号的accessToken工具,,,,,,由于请求次数有限制,,,,,,这里使用全局静态变量生涯起来
public static AccessToken getToken() throws WeixinException, JsonParseException, JsonMappingException, IOException{
if(token == null || token.getExpires_in() < System.currentTimeMillis()){
//拼接参数
String param = "?grant_type=" + grantType + "&appid=" + appId + "&secret=" + secret;
//建设请求工具
HttpsClient http = new HttpsClient();
//挪用获取access_token接口
Response res = http.get("https://api.weixin.qq.com/cgi-bin/token" + param);
System.out.println(res.asString());
ObjectMapper mapper = new ObjectMapper();
token = mapper.readValue(res.asString(),AccessToken.class);
}
return token;
}
其中需要jackson和weixin4j的jar包,,,,,,较量普遍,,,,,,请自行下载;而AccessToken工具也较量简朴,,,,,,就errcode、errmsg、access_token、expires_in这四个参数,,,,,,较量简朴,,,,,,在文章最后贴代码
2:升级微信卡券
着实这个方法也可以省略,,,,,,升级微信卡券的目的是可以直接从微信卡券跳转到对应的小程序,,,,,,博主就偷懒了,,,,,,直接跳过了这个方法;
不过升级卡券也较量简朴,,,,,,就是挪用挪用微信公众号的更改微信卡券接口(URL:https://api.weixin.qq.com/card/update?access_token=TOKEN),,,,,,添加几个字段,,,,,,可以参考微信官方文档3.1,,,,,,链接如下:https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1490190158&version=1&lang=zh_CN&platform=2
3:领取卡券
3.1:先获取openId
小程序端代码,,,,,,通过挪用wx.login获取code,,,,,,再挪用https://api.weixin.qq.com/sns/jscode2session接口获取openid,,,,,,博主看到许多例子是直接从小程序端挪用这个接口,,,,,,但我事实中发明是行欠亨的,,,,,,由于这个域名无法添加到小程序的request正当域名中,,,,,,微信给的说明是不要在前端挪用这个接口,,,,,,需要通事后台
wx.login({
success: function (res) {
var service_url = 'https://???/???/weixin/api/login?code=' + res.code;//需要将服务器域名添加到小程序的request正当域名中,,,,,,并且必需是https开头
wx.request({
url: l,
data: {},
method: 'GET',
success: function (res) {
console.log(res);
if (res.data != null && res.data != undefined && res.data != '') {
wx.setStorageSync("openid", res.data.openid);//将获取的openid存到缓存中
}
}
});
}
});
后端java代码
/**
* 小程序后台登录,,,,,,向微信平台发送获取access_token请求,,,,,,并返回openId
* @param code
* @return 用户凭证
* @throws WeixinException
* @throws IOException
* @throws JsonMappingException
* @throws JsonParseException
*/
@RequestMapping("login")
@ResponseBody
public Map<String, Object> login(String code, HttpServletRequest request) throws WeixinException, JsonParseException, JsonMappingException, IOException {
if (code == null || code.equals("")) {
throw new WeixinException("invalid null, code is null.");
}
Map<String, Object> ret = new HashMap<String, Object>();
//拼接参数
String param = "?grant_type=" + grant_type + "&appid=" + appid + "&secret=" + secret + "&js_code=" + code;
System.out.println("https://api.weixin.qq.com/sns/jscode2session" + param);
//建设请求工具
HttpsClient http = new HttpsClient();
//挪用获取access_token接口
Response res = http.get("https://api.weixin.qq.com/sns/jscode2session" + param);
//凭证请求效果判断,,,,,,是否验证乐成
JSONObject jsonObj = res.asJSONObject();
if (jsonObj != null) {
Object errcode = jsonObj.get("errcode");
if (errcode != null) {
//返回异常信息
throw new WeixinException(getCause(Integer.parseInt(errcode.toString())));
}
ObjectMapper mapper = new ObjectMapper();
OAuthJsToken oauthJsToken = mapper.readValue(jsonObj.toJSONString(),OAuthJsToken.class);
ret.put("openid", oauthJsToken.getOpenid());
}
return ret;
}
其中OAuthJsToken工具的字段为:openid、expires_in、session_key(会话密钥) ,,,,,,在文章最后贴代码;
3.2:天生领取卡券的署名,,,,,,并挪用wx.addCard要领领取卡券
这边写贴java后端代码
public static ApiTicket ticket = null;//使用全局静态变量存储ApiTicket工具,,,,,,虽然若是使用缓存框架生涯虽然更好,,,,,,这边只是做一个简朴示例
/**
* @Description: 获取领取卡券获取署名等参数
* @param cardId:需要领取的卡券的cardId
* @return
* @throws WeixinException
* @throws JsonParseException
* @throws JsonMappingException
* @throws IOException
*/
@RequestMapping("getCardSign")
@ResponseBody
public Map<String, String> getCardSign(String cardId) throws WeixinException, JsonParseException, JsonMappingException, IOException{
Map<String, String> ret = new HashMap<String, String>();
//先要获取api_ticket,,,,,,由于请求api_ticket的接口会见有次数限制,,,,,,以是最好将获获得的api_ticket生涯到缓存中,,,,,,这边做法较量简朴,,,,,,直接使用的静态变量
if(ticket == null || ticket.getExpires_in() < System.currentTimeMillis()){
//建设请求工具
HttpsClient http = new HttpsClient();
ObjectMapper mapper = new ObjectMapper();
AccessToken token = OpenApi.getToken();//这里获取的token就是最上方代码生涯的微信公众号全局静态变量token
//通过access_token挪用获取api_ticket接口
Response res = http.get("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token.getAccess_token() + "&type=wx_card");
System.out.println(res.asString());
ticket = mapper.readValue(res.asString(), ApiTicket.class);
}
ret = sign(ticket.getTicket(), cardId);//天生领取卡券需要的署名,,,,,,并返回相关的参数
for (Map.Entry entry : ret.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
return ret;
}
/**
* @Description: 天生卡券需要的署名并返回参数
* @param api_ticket:
* @param cardId:需要领取的卡券的cardId
* @return
*/
public static Map<String, String> sign(String api_ticket, String cardId) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String signature = "";
String param[] = new String[4];
param[0] = nonce_str;
param[1] = timestamp;
param[2] = api_ticket;
param[3] = cardId;
Arrays.sort(param);//对参数的value值举行字符串的字典序排序
StringBuilder sb = new StringBuilder();
for(String b : param){
sb.append(b);
}
System.out.println(sb);
//对上面拼接的字符串举行sha1加密,,,,,,获得signature
try{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(sb.toString().getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
}catch (NoSuchAlgorithmException e){
e.printStackTrace();
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
//返回领取卡券需要的参数,,,,,,其中nonceStr和timestamp必需和署名中的坚持一致
ret.put("card_id", cardId);
ret.put("api_ticket", api_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
return ret;
}
其中ApiTicket工具的属性有:errcode、errmsg、ticket、expires_in,,,,,,在文章最后贴出该代码
再贴小程序端代码
ok,,,,,,若是领取乐成,,,,,,可以直接到微信卡包内里审查。。。。。。下面贴出AccessToken、ApiTicket、OAuthJsToken的jav
以上是这篇微信小程序领取优惠券接入流程,,,,,,希望可以资助到各人,,,,,,谢谢。。。。。。
小程序工具提供多类型商城/门店小程序制作,,,,,,可视化编辑 1秒天生5步上线。。。。。。通过拖拽、拼接模?????榻峁剐〕绦蛏坛且趁妫,,,,,所看即所得,,,,,,只需要美工就能做出细腻商城。。。。。。
有关进一步相识小程序开发案例,,,,,,请前往:/miniprogramdev/
【本站声明】
1、本站文章中所选用的图片及文字泉源于网络以及用户投稿,,,,,,由于未联系到知识产权人或未发明有关知识产权的挂号,,,,,,若有知识产权人并不肯意我们使用,,,,,,若是有侵权请连忙联系。。。。。。
2、本网站差池文章中所涉及的内容真实性、准确性、可靠性认真,,,,,,仅系客观性形貌,,,,,,如您需要相识该类商品/服务详细的资讯,,,,,,请您直接与该类商品/服务的提供者联系。。。。。。
KESION pp电子软件
KESION pp电子软件是海内领先的在线教育软件及私域社交电商软件服务提供商,,,,,,恒久专注于为企业提供在线教育软件及社交电商SaaS平台解决方案。。。。。。
公司焦点产品云开店SaaS社交电商服务平台、在线教育SaaS服务平台、教育企业数字化SaaS云平台、企微营销助手、私有化自力安排品牌网校和在线教育咨询等。。。。。。KESION 一直通过手艺立异,,,,,,提供产品和服务,,,,,,助力企业向数字化转型,,,,,,通过科技驱动商业刷新,,,,,,让商业变得更智慧!