关于卡券对于商家的营销还是很重要的,主要为大家讲解一下微信小程序卡券的准备工作,以及主要流程和当时开发时遇到的错误示范。
关于准备工作,关键还是要先看官方给的开发文档。是关于小程序&卡券打通的官网文档教程。
下面主要还是将关于小程序里面的卡券领取过程
准备材料:微信公众号:APPID和appSecret微信开通卡券功能,手动在后台创建一个卡券获取card_id
官网返回码说明:
第一步:获取token(很多步骤都需要)将里面的APPID和APPSECRET替换为自己公众号准备的材料里面。
Stringurl=ACCECC_TOKEN_URL.replace("APPID",APPID).replace("APPSECRET",APPSECRET);JSONObjectjsonObject=doGetStr(url);//调用get方法if(jsonObject!=null)token=jsonObject.getString("access_token"));//获取得到的token第二步:获取api_ticket卡券api_ticket是用于调用卡券相关接口的临时票据用第一步拿到的token值,采用get请求方式获得卡券api_ticket地址接口部分代码,和上面获取token的代码类似
Stringurl=API_TICKET.replace("ACCESS_TOKEN",Open_Id.getToken());JSONObjectjsonObject=doGetStr(url);if(jsonObject!=null)api_ticket=jsonObject.getString("ticket"));这个是官方的开发文档在附录4:卡券扩展字段及签名生成算法
第三步:加密算法signature首先获取时间戳timestamp:注意用System.currentTimeMillis()获取的是毫秒,加密要求的是秒,要除以1000才可以
/获取时间戳@return/publicStringtimestamp(){Stringtime=String.valueOf(System.currentTimeMillis()/1000);//获取一个时间戳转换为String类型returntime;}随机字符串nonce_str:自己随便写一个随机字符串就可以了
/Createdbyhuboon2017/11/7随机字符串/publicclassAccessnonce_str{privatefinalstaticStringstring="0123456789";finalprivatestaticchar[]chars=string.toCharArray();publicStringnonce_str(){Stringnonce=newString();for(inti=0;i10;i++){intrannum=(int)(Math.random()1000)%(chars.length);nonce+=chars[rannum];}returnnonce;}}将获取的api_ticket,timestamp,nonce_str,card_id(这个我是在微信后台手动创建获取的)加密算法主要是字典序,然后将这些参数字符串拼接成为一个字符串,之后进行Sha1加密加密算法代码
/Createdbyhuboon2017/11/7加密signature/publicclassWeixinSignature{privateStringapi_ticket;privateStringtimestamp;privateStringcard_id;privateStringnonce_str;publicWeixinSignature(Stringapi_ticket,Stringtimestamp,Stringcard_id,Stringnonce_str){this.api_ticket=api_ticket;this.timestamp=timestamp;this.card_id=card_id;this.nonce_str=nonce_str;}/加密参数@return/publicStringsign(){String[]str={api_ticket,timestamp,card_id,nonce_str};Arrays.sort(str);Stringstring=newString();for(inti=0;i4;i++){string+=str[i];}Stringsignature=null;//加密结果signature=CheckUtil.getSha1(string);//Sha1加密returnsignature;}}下面是Sha1加密算法代码
//Sha1加密publicstaticStringgetSha1(Stringstr){if(str==null||str.length()==0){returnnull;}charhexDigits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};try{MessageDigestmdTemp=MessageDigest.getInstance("SHA1");mdTemp.update(str.getBytes("UTF-8"));byte[]md=mdTemp.digest();intj=md.length;charbuf[]=newchar[j2];intk=0;for(inti=0;ij;i++){bytebyte0=md[i];buf[k++]=hexDigits[byte04&0xf];buf[k++]=hexDigits[byte0&0xf];}returnnewString(buf);}catch(Exceptione){//TODO:handleexceptionreturnnull;}}加密signature官方提供的检验地址自己看加密的结果和官网给返回的结果比较第四步:微信小程序领取卡券代码部分
wx.request({url:'http://访问返回数据的地址',data:{card:card},method:'GET',success:function(res){varres=res.data;console.log(res);varcard=res.card_id;vartimestamp=res.timestamp;varsignature=res.signature;varnonceStr=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对象
WeixinSignaturesignature=newWeixinSignature(Open_Id.getApiTicket(),Open_Id.getTime(),Card_Id.getCardid(),nonce);//获取signaturePrintWriterout=resp.getWriter();//返回网页请求的数据JSONObjectjsonObject=newJSONObject();//返回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());
获取这四个参数后调用微信小程序的卡券领取我主要是通过这四个步骤做好的微信小程序卡券领取功能,其余的功能就需要扩展开发了。
自己也是小白,开发过程也没多复杂的,主要是领取卡券的过程步骤还有一些细节我都写下了,由于写完之后又添加了许多功能,代码也就传了一部分。有可能还有什么没写上去的,可以加qq交流下。













