package com.yc.education.controller; import com.wxpay.WxPayConfig; import com.wxpay.zhuanz.CertHttpUtil; import com.wxpay.zhuanz.WXPayUtil; import com.yc.education.model.Orders; import com.yc.education.model.Users; import com.yc.education.service.UsersService; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import static com.wxpay.zhuanz.WXPayUtil.*; /** * @author caolong * @version 1.0.0 * @Details * @ClassName WxTransferController * @Description TODO * @createTime 2019-07-23 09:29:00 */ @RestController @RequestMapping("/api") public class WxTransferController extends BaseController { public final static String SSLCERT_PATH = "/usr/local/java/zhengshu/apiclient_cert.p12"; private static int socketTimeout = 10000;// 连接超时时间,默认10秒 private static int connectTimeout = 30000;// 传输超时时间,默认30秒 private static RequestConfig requestConfig; private static CloseableHttpClient httpClient;// HTTP请求器 @Autowired private UsersService usersService; /** * @Title: transfer * @Description: 企业转账到零钱 * @param: * @return: */ // @RequestMapping("pay.html") public String transfer(HttpServletRequest request, Orders orders) { Integer userid = orders.getUserid(); Users users = usersService.selectByKey(userid); // 1.0 拼凑企业支付需要的参数 String appid = WxPayConfig.APPID; // 微信公众号的appid String mch_id = WxPayConfig.APPPAYMCH; // 商户号 String nonce_str = generateNonceStr(); // 生成随机数 String partner_trade_no = generateNonceStr(); // 生成商户订单号 String openid = users.getOpenid(); // 支付给用户openid String check_name = "NO_CHECK"; // 是否验证真实姓名呢 String re_user_name = users.getRzname(); // 收款用户姓名(非必须) String amount = orders.getPayforprice().multiply(new BigDecimal(100)).toString(); // 企业付款金额,最少为100,单位为分 String desc = "赔付金额"; // 企业付款操作说明信息。必填。 String spbill_create_ip = getRequestIp(request); // 用户的ip地址 // 2.0 生成map集合 SortedMap packageParams = new TreeMap(); packageParams.put("mch_appid", appid); // 微信公众号的appid packageParams.put("mchid", mch_id); // 商务号 packageParams.put("nonce_str", nonce_str); // 随机生成后数字,保证安全性 packageParams.put("partner_trade_no", partner_trade_no); // 生成商户订单号 packageParams.put("openid", openid); // 支付给用户openid packageParams.put("check_name", check_name); // 是否验证真实姓名呢 packageParams.put("re_user_name", re_user_name);// 收款用户姓名 packageParams.put("amount", amount); // 企业付款金额,单位为分 packageParams.put("desc", desc); // 企业付款操作说明信息。必填。 packageParams.put("spbill_create_ip", spbill_create_ip); // 调用接口的机器Ip地址 try { // 3.0 利用上面的参数,先去生成自己的签名 String sign = WXPayUtil.generateSignature(packageParams, WxPayConfig.APPPAYKEY); // 4.0 将签名再放回map中,它也是一个参数 packageParams.put("sign", sign); // 5.0将当前的map结合转化成xml格式 String xml = mapToXml(packageParams); // 6.0获取需要发送的url地址 String wxUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // 获取退款的api接口 System.out.println("发送前的xml为:" + xml.toString()); // 7,向微信发送请求转账请求 String returnXml = CertHttpUtil.postData(wxUrl, xml); System.out.println("返回的returnXml为:" + returnXml); // 8,将微信返回的xml结果转成map格式 Map returnMap = xmlToMap(returnXml); if (returnMap.get("return_code").equals("SUCCESS")) { // 付款成功 System.out.println("returnMap为:" + returnMap); } return returnXml; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return "error"; } /** * @Title: getRequestIp * @Description: 获取用户的ip地址 * @param: * @return: */ public static String getRequestIp(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } if (ip.indexOf(",") != -1) { String[] ips = ip.split(","); ip = ips[0].trim(); } return ip; } }