WxTransferController.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package com.yc.education.controller;
  2. import com.wxpay.WxPayConfig;
  3. import com.wxpay.zhuanz.CertHttpUtil;
  4. import com.wxpay.zhuanz.WXPayUtil;
  5. import com.yc.education.model.Orders;
  6. import com.yc.education.model.Users;
  7. import com.yc.education.service.UsersService;
  8. import org.apache.http.client.config.RequestConfig;
  9. import org.apache.http.impl.client.CloseableHttpClient;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.web.bind.annotation.RequestMapping;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import javax.servlet.http.HttpServletRequest;
  14. import java.math.BigDecimal;
  15. import java.util.Map;
  16. import java.util.SortedMap;
  17. import java.util.TreeMap;
  18. import static com.wxpay.zhuanz.WXPayUtil.*;
  19. /**
  20. * @author caolong
  21. * @version 1.0.0
  22. * @Details
  23. * @ClassName WxTransferController
  24. * @Description TODO
  25. * @createTime 2019-07-23 09:29:00
  26. */
  27. @RestController
  28. @RequestMapping("/api")
  29. public class WxTransferController extends BaseController {
  30. public final static String SSLCERT_PATH = "/usr/local/java/zhengshu/apiclient_cert.p12";
  31. private static int socketTimeout = 10000;// 连接超时时间,默认10秒
  32. private static int connectTimeout = 30000;// 传输超时时间,默认30秒
  33. private static RequestConfig requestConfig;
  34. private static CloseableHttpClient httpClient;// HTTP请求器
  35. @Autowired
  36. private UsersService usersService;
  37. /**
  38. * @Title: transfer
  39. * @Description: 企业转账到零钱
  40. * @param:
  41. * @return:
  42. */
  43. // @RequestMapping("pay.html")
  44. public String transfer(HttpServletRequest request, Orders orders) {
  45. Integer userid = orders.getUserid();
  46. Users users = usersService.selectByKey(userid);
  47. // 1.0 拼凑企业支付需要的参数
  48. String appid = WxPayConfig.APPID; // 微信公众号的appid
  49. String mch_id = WxPayConfig.APPPAYMCH; // 商户号
  50. String nonce_str = generateNonceStr(); // 生成随机数
  51. String partner_trade_no = generateNonceStr(); // 生成商户订单号
  52. String openid = users.getOpenid(); // 支付给用户openid
  53. String check_name = "NO_CHECK"; // 是否验证真实姓名呢
  54. String re_user_name = users.getRzname(); // 收款用户姓名(非必须)
  55. String amount = orders.getPayforprice().multiply(new BigDecimal(100)).toString(); // 企业付款金额,最少为100,单位为分
  56. String desc = "赔付金额"; // 企业付款操作说明信息。必填。
  57. String spbill_create_ip = getRequestIp(request); // 用户的ip地址
  58. // 2.0 生成map集合
  59. SortedMap<String, String> packageParams = new TreeMap<String, String>();
  60. packageParams.put("mch_appid", appid); // 微信公众号的appid
  61. packageParams.put("mchid", mch_id); // 商务号
  62. packageParams.put("nonce_str", nonce_str); // 随机生成后数字,保证安全性
  63. packageParams.put("partner_trade_no", partner_trade_no); // 生成商户订单号
  64. packageParams.put("openid", openid); // 支付给用户openid
  65. packageParams.put("check_name", check_name); // 是否验证真实姓名呢
  66. packageParams.put("re_user_name", re_user_name);// 收款用户姓名
  67. packageParams.put("amount", amount); // 企业付款金额,单位为分
  68. packageParams.put("desc", desc); // 企业付款操作说明信息。必填。
  69. packageParams.put("spbill_create_ip", spbill_create_ip); // 调用接口的机器Ip地址
  70. try {
  71. // 3.0 利用上面的参数,先去生成自己的签名
  72. String sign = WXPayUtil.generateSignature(packageParams, WxPayConfig.APPPAYKEY);
  73. // 4.0 将签名再放回map中,它也是一个参数
  74. packageParams.put("sign", sign);
  75. // 5.0将当前的map结合转化成xml格式
  76. String xml = mapToXml(packageParams);
  77. // 6.0获取需要发送的url地址
  78. String wxUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // 获取退款的api接口
  79. System.out.println("发送前的xml为:" + xml.toString());
  80. // 7,向微信发送请求转账请求
  81. String returnXml = CertHttpUtil.postData(wxUrl, xml);
  82. System.out.println("返回的returnXml为:" + returnXml);
  83. // 8,将微信返回的xml结果转成map格式
  84. Map<String, String> returnMap = xmlToMap(returnXml);
  85. if (returnMap.get("return_code").equals("SUCCESS")) {
  86. // 付款成功
  87. System.out.println("returnMap为:" + returnMap);
  88. }
  89. return returnXml;
  90. } catch (Exception e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. }
  94. return "error";
  95. }
  96. /**
  97. * @Title: getRequestIp
  98. * @Description: 获取用户的ip地址
  99. * @param:
  100. * @return:
  101. */
  102. public static String getRequestIp(HttpServletRequest request) {
  103. String ip = request.getHeader("x-forwarded-for");
  104. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  105. ip = request.getHeader("Proxy-Client-IP");
  106. }
  107. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  108. ip = request.getHeader("WL-Proxy-Client-IP");
  109. }
  110. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  111. ip = request.getRemoteAddr();
  112. }
  113. if (ip.indexOf(",") != -1) {
  114. String[] ips = ip.split(",");
  115. ip = ips[0].trim();
  116. }
  117. return ip;
  118. }
  119. }