微信发红包代码,解决中文乱码问题

微信发红包代码,解决中文乱码问题

 

废话不说,直接上代码。

package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.security.KeyStore;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import weixin.shop.util.Md5Encrypt;

/**
 * 发送红包测试
 *
 * @author lenovo
 *
 */
public class RedPackTest {
 /**
  * 红包发放接口
  */
 public static final String TICKET_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";

 /**
  * API密钥,在商户里账户设置中API安全中的API密钥设置密钥
  */
 private static String key = "357e0bf2473b7c88c6d1900abeeeeeab";

 /**
  * 调用发送红包接口的参数
  */
 private String[] paramKeys = new String[] { "nonce_str", "sign", "mch_billno", "mch_id", "sub_mch_id", "wxappid",
   "nick_name", "send_name", "re_openid", "total_amount", "min_value", "max_value", "total_num", "wishing",
   "client_ip", "act_name", "remark", "logo_imgurl", "share_content", "share_url", "share_imgurl" };

 public static void main(String[] args) {
  try {
   RedPackTest redPackTest = new RedPackTest();
   String signString = redPackTest.createSignString();
   System.out.println("signString=" + signString);
   String sign = redPackTest.createSign(signString, key);
   System.out.println("sign=" + sign);
   String xml = redPackTest.createXML(sign);
   System.out.println("xml=" + xml);
   redPackTest.sendRedPacket(xml);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 生成签名字符串 <br>
  * 设所有发送或者接收到的数据为集合M,<br>
  * 将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序)<br>
  * 使用URL键值对的格式(即key1=value1&key2=value2…) <br>
  * 拼接成字符串stringA<br>
  * 特别注意以下重要规则:<br>
  * 参数名ASCII码从小到大排序(字典序);<br>
  * 如果参数的值为空不参与签名;<br>
  * 参数名区分大小写;<br>
  * 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。<br>
  * 微信接口可能增加字段,验证签名时必须支持增加的扩展字段<br>
  *
  * @return
  */
 private String createSignString() {
  StringBuffer signString = new StringBuffer("");
  Arrays.sort(paramKeys);
  for (String param : paramKeys) {
   try {
    Class<?> clz = Class.forName("test.RedPack");
    Object o = clz.newInstance();
    Method m = clz.getMethod("get" + param.substring(0, 1).toUpperCase()
      + param.substring(1, param.length()));
    String value = (String) m.invoke(o);
    if (value != null && !"".equals(value)) {
     signString.append(param + "=" + value + "&");
    }
   } catch (Exception e) {
   }
  }
  return signString.substring(0, signString.length() - 1);
 }


 /**
  * 生成XML
  *
  * @return
  */
 private String createXML(String sign) {
  StringBuffer signString = new StringBuffer("<xml>");
  Arrays.sort(paramKeys);
  for (String param : paramKeys) {
   try {
    Class<?> clz = Class.forName("test.RedPack");
    Object o = clz.newInstance();
    Method m = clz.getMethod("get" + param.substring(0, 1).toUpperCase()
      + param.substring(1, param.length()));
    String value = (String) m.invoke(o);
    if (value != null && !"".equals(value)) {
     signString.append("<" + param + ">" + value + "</" + param + ">");
    }
   } catch (Exception e) {
   }
  }
  return signString + "<sign>" + sign + "</sign></xml>";
 }

 /**
  * 生成签名<br>
  * 在stringA最后拼接上key=(API密钥的值)得到stringSignTemp字符串,<br>
  * 并对stringSignTemp进行MD5运算,<br>
  * 再将得到的字符串所有字符转换为大写,<br>
  * 得到sign值signValue
  *
  * @param signString
  * @param key
  * @return
  */
 private String createSign(String signString, String key) {
  String sign = signString + "&key=" + key;
  return Md5Encrypt.md5(sign).toUpperCase();
 }

 /**
  * 发送红包
  *
  * @param xml
  * @throws Exception
  */
 public void sendRedPacket(String xml) throws Exception {
  KeyStore keyStore = KeyStore.getInstance("PKCS12");
  FileInputStream instream = new FileInputStream(new File("D:/apiclient_cert.p12"));
  try {
   keyStore.load(instream, "1234344302".toCharArray());
  } finally {
   instream.close();
  }
  // Trust own CA and all self-signed certs
  SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "1234344302".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 {
   HttpPost httpPost = new HttpPost(TICKET_URL);
   System.out.println("executing request" + httpPost.getRequestLine());
   //中文不成功是因为没加编码
   StringEntity myEntity = new StringEntity(xml, "utf-8");
   httpPost.setEntity(myEntity);
   CloseableHttpResponse response = httpclient.execute(httpPost);
   try {
    HttpEntity entity1 = response.getEntity();
    System.out.println("----------------------------------------");
    System.out.println(response.getStatusLine());
    if (entity1 != null) {
     System.out.println("Response content length: " + entity1.getContentLength());
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity1.getContent()));
     String text;
     while ((text = bufferedReader.readLine()) != null) {
      System.out.println(new String(text.getBytes("gbk"), "utf-8"));
     }
    }
    EntityUtils.consume(entity1);
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    response.close();
   }
  } finally {
   httpclient.close();
  }
 }
}

 

如有问题,欢迎加入JEEWX技术交流群:4六六5六3182,一起研究微信开发平台!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

军哥说AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值