微信小程序 -- 微信小程序发送红包

这篇具有很好参考价值的文章主要介绍了微信小程序 -- 微信小程序发送红包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序 -- 微信小程序发送红包

前言

参考链接:微信小程序 – 微信小程序发送红包

最近在写的项目,关于微信“一物一码”。用户扫码直接跳转到微信小程序中,进入抽奖活动。中奖后可以直接在小程序中发送微信红包。
在此记录一下微信小程序发红包的过程

正文

首先介绍一下微信小程序红包的大致流程。
1、组织参数,调用微信发送红包接口。(此处最重要的是参数签名)
2、获取微信返回结果,组织小程序端调用领取红包接口参数(还有签名!)
3、小程序端,调用领取微信红包接口,领取红包

组织参数

  • 点击查看微信的文档

微信小程序 -- 微信小程序发送红包

  • 发送示例
//获取发红包的参数
WechatRedPackRequest request = setRequest(amount, mchBillno, openId, actName);
//读取安全证书
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(CERTIFICATE_NAME);
logger.info("开始发送红包-->请求实体-->"+ JSON.toJSONString(request));
//发送发红包请求到微信
String resp = HttpUtil.wechatPost(WeixinConfig.API_URL, WeChatUtils.convertObjectToXml(request, WechatRedPackRequest.class), inputStream);
logger.info("红包发送结束-->返回XML-->"+ resp);
//将xml 转换成map
Map<String,String> response = WeChatUtils.xmlToMap(resp);
logger.info("解析返回XML-->"+ JSON.toJSONString(response));
RedPacketLog result = JSONObject.parseObject(JSON.toJSONString(response),new TypeReference<RedPacketLog>(){});
result.setResultXml(JSON.toJSONString(response));
result.setRequestParam(JSON.toJSONString(request));
return result;
这里最主要的是参数的组织,一般会遇到问题也就是签名的问题。
所以在签名时要注意,推荐使用微信封装好的工具类,最起码不会遇到其他问题。
  • 拼接参数(ASCII码从小到大排序(字典序))
private static String createLinkString(Map<String, String> params) {
        System.out.println(params.toString());
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);

        StringBuilder preStr = new StringBuilder();

        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);
            // 拼接时,不包括最后一个&字符
            if (i == keys.size() - 1) {
                preStr.append(key).append("=").append(value);
            } else {
                preStr.append(key).append("=").append(value).append("&");
            }
        }
        return preStr.toString();
    }
这里的Parms就是所有的参数,注意,商户key参数最后拼接。
如上述,最终的参数拼接位 preStr.toString()+"&key="+"你的商户key";
  • 加密参数

       对最终拼接的参数进行MD5加密,转换成大写字母即可。
    
  • 将参数实体转换成xml格式文章来源地址https://www.toymoban.com/news/detail-495307.html

      在微信的参数格式,使用的是xml格式。
      所以,当获取到所有参数和签名后,还需要将其转换成xml格式,这里有两种方式:
      1、将 实体对象 转换成 xml
      需要使用 Xstream , 在 pom文件中,添加下面依赖
    
<!--将javaBean 转换成 xml-->
    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.10</version>
    </dependency>
简单使用:
public static <T> String convertObjectToXml(Object obj, Class<T> type) {
        XStream xstream = new XStream(new XppDriver(new XmlFriendlyNameCoder("__", "_")));
        xstream.alias("xml", type);
        return xstream.toXML(obj);
    }
2、将 map 转换成 xml
微信提供的demo案例中使用此方法
public static String mapToXml(Map<String, String> data) throws Exception {
        org.w3c.dom.Document document = WeChatXmlUtil.newDocument();
        org.w3c.dom.Element root = document.createElement("xml");
        document.appendChild(root);
        for (String key: data.keySet()) {
            String value =  data.get(key);
            if (value == null) {
                value = "";
            }
            value = value.trim();
            org.w3c.dom.Element filed = document.createElement(key);
            filed.appendChild(document.createTextNode(value));
            root.appendChild(filed);
        }
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        DOMSource source = new DOMSource(document);
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        transformer.transform(source, result);
        String output = writer.getBuffer().toString();
        try {
            writer.close();
        }
        catch (Exception ex) {
        }
        return output;
    }
  • 最后就是发送请求
    相信发送post请求大家都不陌生了吧
 //keyStream 为证书的输入流
 public static String wechatPost(String url,String params, InputStream keyStream ) throws Exception{
        KeyStore keyStore  = KeyStore.getInstance("PKCS12");
        try {
            keyStore.load(keyStream, WeixinConfig.MCH_ID.toCharArray());
        } finally {
            keyStream.close();
        }
        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, WeixinConfig.MCH_ID.toCharArray())
                .build();
        // Allow TLSv1 protocol only
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpclient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .build();
        try {
            String resp = "";
            HttpPost httpPost = new HttpPost(url);
            StringEntity ent = new StringEntity(params,"utf-8");
            ent.setContentType("application/x-www-form-urlencoded");
            httpPost.setEntity(ent);
            CloseableHttpResponse response = httpclient.execute(httpPost);
            try {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    System.out.println("Response content length: " + entity.getContentLength());
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
                    String text;
                    while ((text = bufferedReader.readLine()) != null) {
                        resp += text;
                    }
                }
                EntityUtils.consume(entity);
                return resp;
            }catch(Exception e){
            }
            finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
        return null;
    }
  • 最后就是对微信返回的参数进行解析,建议遇到问题先看微信文档!

组织小程序端需要参数

//response 即为发送红包微信返回的信息转换成的实体类
public static Map<String, String> signResponse(RedPacketLog response)throws Exception{
        if (null != response) {
            if (StringUtils.isEmpty(response.getWxPackage())){
                return null;
            }
			//对微信返回的package要进行URL加密(不需要解密)
            String wxPackage = URLEncoder.encode(response.getWxPackage(), "UTF-8");
            String nonceStr = UUID.randomUUID().toString().replace("-", "");
            String timeStamp = String.valueOf(System.currentTimeMillis());
            Map<String, String> params = new HashMap<String, String>();
            params.put("package", wxPackage);
            params.put("nonceStr", nonceStr);
            params.put("timeStamp", timeStamp);
            params.put("appId", WeixinConfig.APP_ID);
            //获取签名
            String paySign = WeChatUtils.buildResponseSign(params, WeixinConfig.KEY);
            params.put("paySign", paySign);
            logger.info("领取红包所需参数--->" + JSON.toJSONString(params));
            return params;
        }
        return null;
    }

小程序端,调用接口领取红包

wx.sendBizRedPacket({
     timeStamp: timeStamp,
     nonceStr: nonceStr,
     package: package,
     signType: 'MD5', //固定值
     paySign: paySign,
     success: function (res) {},
	 fail : function(res){}
)}
当在小程序端调用接口时,会直接弹出微信红包,领取后存到零钱当中。

到了这里,关于微信小程序 -- 微信小程序发送红包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 5-微信小程序语法参考

    官网传送门 WXML 中的动态数据均来自对应 Page 的 data。 数据绑定使用 Mustache 语法( 双大括号 )将变量包起来 ts WXML Mustache语法应用场景 绑定内容 绑定属性 运算(三元运算、算术运算) 逻辑判断 字符串运算 数据路径运算 注:微信小程序数据绑定与vue2的语法相同 官网传送

    2024年01月18日
    浏览(37)
  • 微信小程序复制链接功能--短链接

    前不久接了一个小程序的需求,要求复制页面短链,链接里面带有参数。 和微信小程序里面的复制链接功能差不多,不过我那个链接里面要带一些参数,所以需要重新生成一个短链接 获取 Short Link 调用服务端API - 生成短链 调用方式有两种: 1、HTTPS 调用 2、云调用 返回的短

    2024年02月11日
    浏览(93)
  • 微信小程序的分享链接

    公司要做一个微信的小程序的分享链接,简单讲一下,这个分享可以在浏览器打开,也算不用那些付费的外链了,用的是java。 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html 不需要用的是http请求。 代码如下(示例):

    2024年02月14日
    浏览(52)
  • 获取微信小程序具体链接

    1、先绑定小程序  2、点击首页图文消息  3、点击小程序,输入小程序appID (小程序appId可以通过小程序,更多资料查看   -附获取appid相关链接 微信小程序AppID、原始ID的获取方法-微星极光运营小课堂 - 微星极光—大鬼图文助手)    4、输入完appid点击下一步 ,点击获取更多

    2024年02月11日
    浏览(53)
  • 链接拉起微信小程序

    前言:之前做过RN的 app 拉起小程序 外链拉起app,需求变更,需要支持微信分享出去的链接拉起小程序,这里对微信分享做个补充 准备工作 :微信开放平台绑定小程序 绑定时需要管理员账号 app 和小程序同一开发平台时,不用其他额外设置,如果不是同一平台,需要app绑定小

    2024年02月08日
    浏览(35)
  • 【微信支付】springboot-java接入微信支付-JSAPI支付/查单/退款/发送红包(三)---退款

    微信支付开发文档:https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/create.html 退款与查单的请求头类似,但是查单是GET请求,所以在构造签名的时候相对简单些,但是退款请求中有请求参数,在构造签名时,需要将请求体添加到请求头参数中。 1、构造请求参数 查看微信支付开

    2024年01月19日
    浏览(56)
  • 【微信支付】springboot-java接入微信支付-JSAPI支付/查单/退款/发送红包(二)---查单

    文章地址:https://blog.csdn.net/ssdadasd15623/article/details/134684556 查询订单分为微信订单号查询以及商户订单号查询,这里使用商户订单号,也就是自己的系统的订单号 https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/query-by-out-trade-no.html 在请求接口时,注意⚠️:请求参数内的Authori

    2024年02月03日
    浏览(47)
  • 短信链接跳转微信小程序

    微信官方文档 通过服务端接口或在小程序管理后台生成 URL Scheme 后,自行开发中转H5页面。 将带有中转H5链接的短信内容通过开发者自有的短信发送能力或服务商的短信服务进行投放,实现短信打开小程序。 通过服务端接口生成 URL Link 。 直接将带有URL Link的短信内容通过开

    2024年01月23日
    浏览(68)
  • 微信小程序跳转外部链接

    在开发小程序过程中,我们可能会有这样的需求,在小程序中打开H5或者外部链接 实现方法如下: 小程序管理后台——开发(开发管理)——开发设置:新增业务域名 在这里将你需要的外部链接域名配置完之后,再下载校验文件(校验文件需要放到 当前域名的根目录下 ) 开发者

    2024年02月09日
    浏览(49)
  • 微信小程序使用字体图标——链接引入

    目录 1.下载字体图标  1.选择需要的图标加入购物车添加到项目 2.查看项目  3.生成在线链接   4.复制生成的链接 等下放到iconfont.json中​编辑 2.引入链接 1.下载  2.生成iconfont.json文件 3. 在iconfont.json中 放入生成的链接 4.需要重新编译小程序之后在终端执行 5.在app.json中引入字

    2024年02月16日
    浏览(226)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包