2,在官方文档中给出了证书使用的链接,如下:

[其实只有证书的获取,选择。具体的证书怎么在代码中使用,文档中并没有给出说明]

3,第一步准备请求的参数,里面只有五个是参数是有点特殊的

(1)随机数。官方文档里面给出了说明【这里】

  /**
* StringUtils工具类方法 获取一定长度的随机字符串,范围0-9,a-z
*
* @param length:指定字符串长度
* @return 一定长度的随机字符串
*/
public static String getRandomStringByLength(int length) {
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}

(2)微信订单号(这个是在支付的时候产生的,需要在支付的回调函数中就将其保存在订单表中,待退款时使用)

(3)签名:这个在官方文档中也给出了说明

String mysign = PayUtil.sign(prestr, WxPayConfig.key, "utf-8").toUpperCase();
    /**
* 签名字符串
*
* @param text需要签名的字符串
* @param key 密钥
* @param input_charset编码格式
* @return 签名结果
*/
public static String sign(String text, String key, String input_charset) {
text = text + "&key=" + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}
 public static String md5Hex(final byte[] data) {
return Hex.encodeHexString(md5(data));
}
 public static String encodeHexString(final byte[] data) {
return new String(encodeHex(data));
}
 public static char[] encodeHex(final byte[] data) {
return encodeHex(data, true);
}
public static char[] encodeHex(final byte[] data, final boolean toLowerCase) {
return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
}
    protected static char[] encodeHex(final byte[] data, final char[] toDigits) {
final int l = data.length;
final char[] out = new char[l << 1];
// two characters form the hex value.
for (int i = 0, j = 0; i < l; i++) {
out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
out[j++] = toDigits[0x0F & data[i]];
}
return out;
}

(4)两个整形的参数(一定要注意类型【否则报参数格式错误】)

这两个参数是取得订单类的属性,在订单类中,这两个参数我是定义的Double的类型,单位:元。传的参数是以分为单位的整形,因此就需要乘100。

还有一点需要注意的是,举个例子吧:

  在这里我测试的是0.01(一分)直接乘100,他的结果是1.0,这个结果是不对的,需要把后面的".0"去掉,

4,所有参数准备好之后就是发顺宏请求了,这里比较特殊的就是他需要证书,然而官方文档只给了证书的获取方式,以及不同语言的选择,并没有告诉我们怎么用。

下面就是本篇最重要的地方

public static void  refund(Order order) throws Exception {
try {
KeyStore clientStore = KeyStore.getInstance("PKCS12");
// 读取本机存放的PKCS12证书文件
FileInputStream instream = new FileInputStream("****\\apiclient_cert.p12");
try {
// 指定PKCS12的密码(商户ID)
clientStore.load(instream, "***".toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(clientStore, "***".toCharArray()).build();
// 指定TLS版本
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
// 设置httpclient的SSLSocketFactory
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
try {
HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund"); // 设置响应头信息
// httpost.addHeader("Connection", "keep-alive");
// httpost.addHeader("Accept", "*/*");
// httpost.addHeader("Content-Type", CONTENT_TYPE_FORM.toString());
// httpost.addHeader("X-Requested-With", "XMLHttpRequest");
// httpost.addHeader("Cache-Control", "max-age=0");
// httpost.addHeader("User-Agent", DEFAULT_USER_AGENT);
httpost.setEntity(new StringEntity(getXmlStr(order), "UTF-8"));
CloseableHttpResponse response = httpclient.execute(httpost);
try {
HttpEntity entity = response.getEntity();
String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
EntityUtils.consume(entity);
System.out.println(jsonStr);
} finally {
response.close();
}
} finally {
httpclient.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

测试类

public static void main(String[] args) throws Exception {
Order order = new Order();
refund(order);
}

最新文章

  1. SharePoint 2013 Excel Services ECMAScript 示例之明日限行
  2. Money类
  3. 根据路径获得文件名以及Aspose.Cells.dll操作excel 以及使用iTextSharp.text.pdf.PdfReader.dll对PDF的操作
  4. html+css 知识整理
  5. JAVA类与对象(一)----基础概念理解
  6. 关于修改动态库DLL的问题
  7. B. Berland Bingo
  8. php微信支付接口开发程序
  9. 安卓之cannot convert from Fragment1 to Fragment
  10. Java学习之InputStream中read()与read(byte[] b)
  11. cssradius
  12. 从arduino到32单片机的转型
  13. make: 警告:检测到时钟错误。您的创建可能是不完整的。
  14. Android实现图片的压缩、旋转工具类
  15. MongoDB学习记录(一) - 安装、启动与建立数据库
  16. java-环境安装及配置
  17. mongodb的学习笔记一(集合和文档的增删改查)
  18. week3a:个人博客作业
  19. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
  20. 关于Cocos2d-x中节点和精灵的关系以及初始化

热门文章

  1. Spring学习--引用其他Bean , 内部Bean
  2. JS表单验证优化
  3. React 开发常见报错解决方法
  4. python实现多个文件的分发
  5. bzoj 1041 数学推理
  6. 遍历文档内容,得到HTML层级结构
  7. appium===报错adb server version (31) doesn’t match this client (39); killing…的解决办法
  8. 关于Solaris的一些小技巧
  9. web页面的点对点复制粘贴
  10. javascript字符串中包含特殊字符问题