微信小程序> 微信小程序卡券领取

微信小程序卡券领取

浏览量:2155 时间: 来源:9509

首先在公众号后台获取卡券id,获取公众号的appid和accessToken,opendid(小程序端):小程序登陆时获取存起来

导入weixin4j包

java代码,小程序略

package com.enation.app.shop.wechat.controller;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.weixin4j.WeixinException;import org.weixin4j.http.HttpsClient;import org.weixin4j.http.Response;import com.enation.app.shop.wechat.model.AccessToken;import com.enation.app.shop.wechat.model.ApiTicket;import com.enation.app.shop.wechat.model.WeixinSignature;import com.enation.app.shop.wechat.utils.WeChatCart;import com.fasterxml.jackson.core.JsonParseException;import com.fasterxml.jackson.databind.JsonMappingException;import com.fasterxml.jackson.databind.ObjectMapper;@Controller@RequestMapping("/")public class WechatGetTicket {    public static ApiTicket ticket = null;//使用全局静态变量存储ApiTicket对象,当然如果使用缓存框架保存当然更好,这边只是做一个简单示例    private final static String string = "0123456789";    final private static char[] chars = string.toCharArray();/** * @Description: 获取领取卡券获取签名等参数 * @param cardId:需要领取的卡券的cardId * @return * @throws WeixinException * @throws JsonParseException * @throws JsonMappingException * @throws IOException */@RequestMapping("/")@ResponseBodypublic MapString, String getCardSign(String cardId) throws WeixinException, JsonParseException, JsonMappingException, IOException{MapString, String ret = new HashMapString, 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 = WeChatCart.getToken();//这里获取的token就是最上方代码保存的微信公众号全局静态变量token            System.out.println(token.getErrcode());            //通过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("api_ticket:==========="+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;}/** * @param api_ticket: * @param cardId:需要领取的卡券的cardId * @return * @Description: 生成卡券需要的签名并返回参数 */public static MapString, String sign(String api_ticket, String cardId) {    MapString, String ret = new HashMapString, String();    String nonce_str = create_nonce_str();    String timestamp = create_timestamp();    String signature = "";        WeixinSignature signatures = new WeixinSignature(api_ticket, timestamp, cardId, nonce_str);    ret.put("card_id", cardId);    ret.put("api_ticket", api_ticket);    ret.put("nonceStr", nonce_str);    ret.put("timestamp", timestamp);    ret.put("signature", signatures.sign());    return ret;}/** * 返回时间戳(秒) * @return */private static String create_timestamp() {    return String.valueOf(new Date().getTime() / 1000);}/** * 返回随机字符串 * @return */private static String create_nonce_str() {    String nonce = new String();    for (int i = 0; i  32; i++) {        int rannum = (int) (Math.random() * 1000) % (chars.length);        nonce += chars[rannum];    }    return nonce;}/**     * Convert byte[] to hex string     * @param src byte[] data     * @return hex string     */    public static String bytesToHexString(byte[] src) {        StringBuilder stringBuilder = new StringBuilder("");        if (src == null || src.length = 0) {            return null;        }        for (int i = 0; i  src.length; i++) {            int v = src[i] & 0xFF;            String hv = Integer.toHexString(v);            if (hv.length()  2) {                stringBuilder.append(0);            }            stringBuilder.append(hv);        }        return stringBuilder.toString();    }}
package com.enation.app.shop.wechat.base;public class BaseResponse {private int errcode;private String errmsg;public int getErrcode() {return errcode;}public void setErrcode(int errcode) {this.errcode = errcode;}public String getErrmsg() {return errmsg;}public void setErrmsg(String errmsg) {this.errmsg = errmsg;}}
package com.enation.app.shop.wechat.model;import com.enation.app.shop.wechat.base.BaseResponse;public class AccessToken extends BaseResponse{private String access_token;private long expires_in;public String getAccess_token() {return access_token;}public void setAccess_token(String access_token) {this.access_token = access_token;}public long getExpires_in() {return expires_in;}public void setExpires_in(long expires_in) {this.expires_in = System.currentTimeMillis() + (expires_in - 100) * 1000;//原expires_in是有效时长,比如:7200,现改为过期的时间戳}}
package com.enation.app.shop.wechat.model;import com.enation.app.shop.wechat.base.BaseResponse;public class ApiTicket extends BaseResponse{private String ticket;private long expires_in;public String getTicket() {return ticket;}public void setTicket(String ticket) {this.ticket = ticket;}public long getExpires_in() {return expires_in;}public void setExpires_in(long expires_in) {this.expires_in = System.currentTimeMillis() + (expires_in - 100) * 1000;//原expires_in是有效时长,比如:7200,现改为过期的时间戳}}
package com.enation.app.shop.wechat.model;public class OAuthJsToken {private String openid;//用户唯一标识private int expires_in = 7200;       //凭证有效时间,单位:秒private String session_key;//会话密匙private long exprexpiredTime;//过期时间public String getOpenid() {return openid;}public void setOpenid(String openid) {this.openid = openid;}public int getExpires_in() {return expires_in;}public void setExpires_in(int expires_in) {this.expires_in = expires_in;this.exprexpiredTime = System.currentTimeMillis() + expires_in * 1000;}public String getSession_key() {return session_key;}public void setSession_key(String session_key) {this.session_key = session_key;}public long getExprexpiredTime() {return exprexpiredTime;}public void setExprexpiredTime(long exprexpiredTime) {this.exprexpiredTime = exprexpiredTime;}/**     * 判断用户凭证是否过期     *     * @return 过期返回 true,否则返回false     */    public boolean isExprexpired() {    return System.currentTimeMillis() = this.exprexpiredTime;    }}
package com.enation.app.shop.wechat.model;import java.util.Arrays;import com.enation.app.shop.wechat.utils.GetSha1;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;  }  public String sign()  {    String[] str = { this.api_ticket, this.timestamp, this.card_id, this.nonce_str };    System.out.println("加密调用的加密参数" + str.toString());    Arrays.sort(str);    String string = new String();    for (int i = 0; i  4; i++) {      string = string + str[i];    }    String signature = null;    signature = GetSha1.getSha1(string);    return signature;  }}
package com.enation.app.shop.wechat.utils;import java.security.MessageDigest;public class GetSha1{  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) {    }    return null;  }}

 

小程序

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎