温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

小程序优惠券源码开发的方法

发布时间:2022-03-14 10:47:28 来源:亿速云 阅读:565 作者:iii 栏目:开发技术

这篇“小程序优惠券源码开发的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“小程序优惠券源码开发的方法”文章吧。

  小程序优惠券源码开发的方法

  如今许多线下商店都开通了小程序,并实现了优惠券接入,来吸引人流,那么对于开发新人来说,如何接入优惠券功能,下面为大家介绍。

  一、开发前准备

  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

以上就是关于“小程序优惠券源码开发的方法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI