From eb3bed79fc72aace6ef2bea643f1476ba4bb33f0 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 30 May 2021 17:54:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?'=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/cweb/config/AuthConfig.java | 1 + .../com/cweb/controller/WechatController.java | 85 ++++++++++++++++--- .../hai/service/impl/HighUserServiceImpl.java | 3 +- 3 files changed, 75 insertions(+), 14 deletions(-) diff --git a/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java b/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java index 804c8e45..e795a16c 100644 --- a/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java +++ b/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java @@ -105,6 +105,7 @@ public class AuthConfig implements WebMvcConfigurer { .excludePathPatterns("/sms/sendSmsCode") .excludePathPatterns("/sms/getSmsCode") .excludePathPatterns("/user/login") + .excludePathPatterns("/user/getUnionId") .excludePathPatterns("/wechat/*") ; } diff --git a/hai-cweb/src/main/java/com/cweb/controller/WechatController.java b/hai-cweb/src/main/java/com/cweb/controller/WechatController.java index e6084174..bef1c632 100644 --- a/hai-cweb/src/main/java/com/cweb/controller/WechatController.java +++ b/hai-cweb/src/main/java/com/cweb/controller/WechatController.java @@ -8,6 +8,9 @@ import com.alibaba.fastjson.JSONObject; import com.cweb.config.SessionKeyCache; import com.cweb.config.SysConst; import com.cweb.config.WxMaConfiguration; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorHelp; import com.hai.common.exception.SysCode; @@ -35,10 +38,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; @Controller @RequestMapping(value = "/wechat") @@ -68,7 +68,7 @@ public class WechatController { final WxMaService wxService = WxMaConfiguration.getMaService(); WxMaJscode2SessionResult session = wxService.jsCode2SessionInfo(code); //保存小程序用户登录的openId及sessionKey信息 - SessionKeyCache.setData(session.getOpenid(), session.getSessionKey(), -1); + SessionKeyCache.setData(session.getOpenid(), session, -1); JSONObject jo = new JSONObject(); jo.put("openId", session.getOpenid()); return ResponseMsgUtil.success(jo); @@ -126,11 +126,11 @@ public class WechatController { throw ErrorHelp.genException(SysCode.MiniProgram, ErrorCode.REQ_PARAMS_ERROR, ""); } //请求微信api,获取用户session_key以及openId - String sessionKey = SessionKeyCache.getData(openId); + WxMaJscode2SessionResult session = SessionKeyCache.getData(openId); final WxMaService wxService = WxMaConfiguration.getMaService(); - WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv); + WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), encryptedData, iv); if (phoneNoInfo == null || StringUtils.isEmpty(phoneNoInfo.getPurePhoneNumber())) { throw ErrorHelp.genException(SysCode.MiniProgram, ErrorCode.WECHAT_DECRYPT_ERROR, "用户phoneNumber解析失败"); } @@ -170,18 +170,22 @@ public class WechatController { throw ErrorHelp.genException(SysCode.MiniProgram, ErrorCode.REQ_PARAMS_ERROR, ""); } //请求微信api,获取用户session_key以及openId - String sessionKey = SessionKeyCache.getData(openId); + WxMaJscode2SessionResult session = SessionKeyCache.getData(openId); + System.out.println(JSONObject.toJSONString(session)); final WxMaService wxService = WxMaConfiguration.getMaService(); + WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), encryptedData, iv); - WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(sessionKey, encryptedData, iv); if (userInfo == null) { throw ErrorHelp.genException(SysCode.MiniProgram, ErrorCode.WECHAT_DECRYPT_ERROR, "用户phoneNumber解析失败"); } - HighUser user = highUserService.findByUnionId(userInfo.getUnionId()); + if (StringUtils.isBlank(session.getUnionid())) { + throw ErrorHelp.genException(SysCode.MiniProgram, ErrorCode.WECHAT_DECRYPT_ERROR, "获取UnionId失败"); + } + HighUser user = highUserService.findByOpenId(session.getOpenid()); if (user == null) { user = new HighUser(); - user.setUnionId(userInfo.getUnionId()); + user.setUnionId(session.getUnionid()); user.setOpenId(openId); user.setRegTime(new Date()); user.setStatus(1); @@ -190,8 +194,10 @@ public class WechatController { user.setName(userInfo.getNickName()); highUserService.insertUser(user); } else { + user.setUnionId(session.getUnionid()); user.setHeaderImg(userInfo.getAvatarUrl()); user.setName(userInfo.getNickName()); + user.setOpenId(userInfo.getOpenId()); highUserService.updateUser(user); } @@ -200,7 +206,7 @@ public class WechatController { user.setPassword(null); highUserModel.setHighUser(user); - SessionObject so = new SessionObject(userInfo.getUnionId(), 1 , highUserModel); + SessionObject so = new SessionObject(user.getUnionId(), 1 , highUserModel); userCenter.save(request, response, so); return ResponseMsgUtil.success(so); @@ -283,11 +289,13 @@ public class WechatController { params.put("openid", openid); params.put("lang", "zh_CN"); JSONObject userInfo = HttpsUtils.doGet("https://api.weixin.qq.com/sns/userinfo", params); - System.out.println(userInfo.toJSONString()); if (StringUtils.isNotBlank(userInfo.getString("errcode"))) { log.error("getH5UserInfo error!", "获取微信用户信息失败"); throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "获取微信用户信息失败"); } + if (StringUtils.isBlank(userInfo.getString("unionid"))) { + throw ErrorHelp.genException(SysCode.MiniProgram, ErrorCode.WECHAT_DECRYPT_ERROR, "获取UnionId失败"); + } HighUser user = highUserService.findByUnionId(userInfo.getString("unionid")); if (user == null) { @@ -301,6 +309,7 @@ public class WechatController { user.setName(userInfo.getString("nickname")); highUserService.insertUser(user); } else { + user.setOpenIdH5(openid); user.setHeaderImg(userInfo.getString("headimgurl")); user.setName(userInfo.getString("nickname")); highUserService.updateUser(user); @@ -320,4 +329,54 @@ public class WechatController { } + @RequestMapping(value = "/getUnionId", method = RequestMethod.GET) + @ResponseBody + @ApiOperation(value = "刷取unionid") + public ResponseData getUnionId(HttpServletRequest request, HttpServletResponse response) { + try { + // 获取access_token + Map params = new HashMap<>(); + params.put("appid", SysConst.getSysConfig().getWxAppId()); + params.put("secret", SysConst.getSysConfig().getWxAppSecret()); + params.put("grant_type", "client_credential"); + JSONObject jsonObject = HttpsUtils.doGet("https://api.weixin.qq.com/cgi-bin/token", params); + System.out.println(jsonObject.toJSONString()); + String accessToken = jsonObject.getString("access_token"); + if (StringUtils.isBlank(accessToken)) { + log.error("getH5UserInfo error!", "获取微信access_token失败" ); + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "获取微信access_token失败"); + } + params.clear(); + List> userMapList = new ArrayList<>(); + Map userMap; + int pageNum = 1; + while (true) { + userMapList.clear();; + PageHelper.startPage(pageNum, 100); + PageInfo pageInfo = new PageInfo<>(highUserService.getListUser(new HashMap<>())); + if (pageInfo.getList().size() > 0) { + for (HighUser user : pageInfo.getList()) { + userMap = new HashMap<>(); + userMap.put("openid", user.getOpenId()); + userMap.put("lang", "zh_CN"); + userMapList.add(userMap); + } + + params.put("user_list", userMapList); + System.out.println(JSONObject.toJSONString(params)); + JSONObject userInfo = HttpsUtils.doPost("https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=" + accessToken, JSONObject.toJSONString(params)); + System.out.println(userInfo.toJSONString()); + } + pageNum++; + break; + } + + return ResponseMsgUtil.success("处理成功"); + + } catch (Exception e) { + return ResponseMsgUtil.exception(e); + } + } + + } diff --git a/hai-service/src/main/java/com/hai/service/impl/HighUserServiceImpl.java b/hai-service/src/main/java/com/hai/service/impl/HighUserServiceImpl.java index bc733468..046f599e 100644 --- a/hai-service/src/main/java/com/hai/service/impl/HighUserServiceImpl.java +++ b/hai-service/src/main/java/com/hai/service/impl/HighUserServiceImpl.java @@ -112,7 +112,7 @@ public class HighUserServiceImpl implements HighUserService { if (highUser == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到用户"); } - if (StringUtils.isBlank(highUser.getPhone())) { + if (StringUtils.isNotBlank(highUser.getPhone())) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "已绑定手机号,请勿重复绑定"); } @@ -125,6 +125,7 @@ public class HighUserServiceImpl implements HighUserService { highUser.setStatus(0); highUserMapper.updateByPrimaryKey(highUser); + user.setGold(user.getGold() + highUser.getGold()); user.setHeaderImg(highUser.getHeaderImg()); user.setName(highUser.getName()); user.setOpenId(highUser.getOpenId()); From a12a6e4e3e0ebacb9bb27e83f2bf1a1f896d228f Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 30 May 2021 23:20:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?'=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/cweb/config/AuthConfig.java | 1 + .../cweb/controller/pay/OrderController.java | 102 +++++++++++++++++- .../src/main/resources/dev/config.properties | 2 +- .../resources/privatekey/apiclient_cert.p12 | Bin 0 -> 2694 bytes .../resources/privatekey/apiclient_cert.pem | 23 ++++ .../resources/privatekey/apiclient_key.pem | 28 +++++ hai-service/pom.xml | 5 + .../java/com/hai/common/utils/HttpsUtils.java | 39 +++++++ 8 files changed, 196 insertions(+), 4 deletions(-) create mode 100644 hai-cweb/src/main/resources/privatekey/apiclient_cert.p12 create mode 100644 hai-cweb/src/main/resources/privatekey/apiclient_cert.pem create mode 100644 hai-cweb/src/main/resources/privatekey/apiclient_key.pem diff --git a/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java b/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java index e795a16c..064875c4 100644 --- a/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java +++ b/hai-cweb/src/main/java/com/cweb/config/AuthConfig.java @@ -106,6 +106,7 @@ public class AuthConfig implements WebMvcConfigurer { .excludePathPatterns("/sms/getSmsCode") .excludePathPatterns("/user/login") .excludePathPatterns("/user/getUnionId") + .excludePathPatterns("/order/orderToH5Pay") .excludePathPatterns("/wechat/*") ; } diff --git a/hai-cweb/src/main/java/com/cweb/controller/pay/OrderController.java b/hai-cweb/src/main/java/com/cweb/controller/pay/OrderController.java index 0243f904..1ba43b8d 100644 --- a/hai-cweb/src/main/java/com/cweb/controller/pay/OrderController.java +++ b/hai-cweb/src/main/java/com/cweb/controller/pay/OrderController.java @@ -1,5 +1,6 @@ package com.cweb.controller.pay; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.cweb.config.SysConst; import com.hai.common.exception.ErrorCode; @@ -9,8 +10,10 @@ import com.hai.common.pay.WechatPayUtil; import com.hai.common.pay.entity.OrderType; import com.hai.common.pay.entity.WeChatPayReqInfo; import com.hai.common.pay.util.MD5Util; +import com.hai.common.security.Base64Util; import com.hai.common.security.SessionObject; import com.hai.common.security.UserCenter; +import com.hai.common.utils.HttpsUtils; import com.hai.common.utils.MathUtils; import com.hai.common.utils.ResponseMsgUtil; import com.hai.entity.HighChildOrder; @@ -21,9 +24,21 @@ import com.hai.model.ResponseData; import com.hai.model.UserInfoModel; import com.hai.service.HighCouponService; import com.hai.service.HighOrderService; +import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; +import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier; +import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; +import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -35,10 +50,11 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.io.*; import java.math.BigDecimal; -import java.util.HashMap; -import java.util.Map; -import java.util.SortedMap; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; /** @@ -207,4 +223,84 @@ public class OrderController { return ResponseMsgUtil.exception(e); } } + + @RequestMapping(value="/orderToH5Pay",method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "H5订单下单") + public ResponseData orderToH5Pay(@RequestBody String reqBodyStr) { + try { + /* if (StringUtils.isBlank(reqBodyStr)) { + log.error("orderToPay error!", "参数错误"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); + } + JSONObject jsonObject = JSONObject.parseObject(reqBodyStr); + Long orderId = jsonObject.getLong("orderId"); + if ( orderId == null) { + log.error("orderToPay error!", "参数错误"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); + }*/ + + Map param = new HashMap<>(); + param.put("appid", SysConst.getSysConfig().getWxMchAppId()); + param.put("mchid", SysConst.getSysConfig().getWxSubMchId()); + param.put("description", "购买商品"); + param.put("out_trade_no", String.valueOf(new Date().getTime())); + param.put("notify_url", SysConst.getSysConfig().getNotifyUrl()); + + Map amountMap = new HashMap<>(); + amountMap.put("total", 1); + param.put("amount", amountMap); + + Map sceneInfoMap = new HashMap<>(); + sceneInfoMap.put("payer_client_ip", "127.0.0.1"); + + Map h5InfoMap = new HashMap<>(); + h5InfoMap.put("type", "Wap"); + sceneInfoMap.put("h5_info", h5InfoMap); + + param.put("scene_info", sceneInfoMap); + + Map header = new HashMap<>(); + String post = getToken("POST", "/v3/pay/transactions/h5", JSONObject.toJSONString(param)); + header.put("Accept","application/json"); + header.put("Authorization", "WECHATPAY2-SHA256-RSA2048 " + post); + + JSONObject object = HttpsUtils.doPost("https://api.mch.weixin.qq.com/v3/pay/transactions/h5", param, header); + return ResponseMsgUtil.success(object); + } catch (Exception e) { + log.error("orderToPay error!", e); + return ResponseMsgUtil.exception(e); + } + } + + String getToken(String method, String url, String body) throws UnsupportedEncodingException, SignatureException, NoSuchAlgorithmException, InvalidKeyException, FileNotFoundException { + + long timeMillis = System.currentTimeMillis(); + String nonceStr = String.valueOf(timeMillis); + long timestamp = System.currentTimeMillis() / 1000; + String message = buildMessage(method, url, timestamp, nonceStr, body); + PrivateKey privateKey = PemUtil.loadPrivateKey(new FileInputStream("G:/hurui-project/hai-parent/hai-cweb/src/main/resources/privatekey/apiclient_key.pem")); + String signature = sign(privateKey,message.getBytes("utf-8")); + + return "mchid=\"" + SysConst.getSysConfig().getWxSubMchId() + "\"," + + "nonce_str=\"" + nonceStr + "\"," + + "timestamp=\"" + timestamp + "\"," + + "serial_no=\"" + "1B08DC2A078B0B1F77A65C97C445AAD545B5EAA6" + "\"," + + "signature=\"" + signature + "\""; + } + + String sign(PrivateKey privateKey,byte[] message) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException { + Signature sign = Signature.getInstance("SHA256withRSA"); + sign.initSign(privateKey); + sign.update(message); + return Base64.getEncoder().encodeToString(sign.sign()); + } + + String buildMessage(String method, String url, long timestamp, String nonceStr, String body) { + return method + "\n" + + url + "\n" + + timestamp + "\n" + + nonceStr + "\n" + + body + "\n"; + } } diff --git a/hai-cweb/src/main/resources/dev/config.properties b/hai-cweb/src/main/resources/dev/config.properties index 39e3ba86..21bbf7d7 100644 --- a/hai-cweb/src/main/resources/dev/config.properties +++ b/hai-cweb/src/main/resources/dev/config.properties @@ -9,7 +9,7 @@ wxApiKey=Skufk5oi85wDFGl888i6wsRSTkdd5df5 wxMchAppId=wx637bd6f7314daa46 wxMchId=1289663601 wxSubAppId=wx8d49e2f83025229d -wxSubMchId=1603942866 +wxSubMchId=1609882817 wxUnifiedOrderUrl=https://api.mch.weixin.qq.com/pay/unifiedorder notifyUrl=https://hsgcs.dctpay.com/crest/wechatpay/notify diff --git a/hai-cweb/src/main/resources/privatekey/apiclient_cert.p12 b/hai-cweb/src/main/resources/privatekey/apiclient_cert.p12 new file mode 100644 index 0000000000000000000000000000000000000000..566140208423df47b1ca9112820af86c5bb4d0df GIT binary patch literal 2694 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 pq~`$xKh96rSZ{{pCq_^ki{ literal 0 HcmV?d00001 diff --git a/hai-cweb/src/main/resources/privatekey/apiclient_cert.pem b/hai-cweb/src/main/resources/privatekey/apiclient_cert.pem new file mode 100644 index 00000000..b4bd434b --- /dev/null +++ b/hai-cweb/src/main/resources/privatekey/apiclient_cert.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIUGwjcKgeLCx93plyXxEWq1UW16qYwDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjEwNTMwMTMwNTM1WhcNMjYwNTI5MTMwNTM1WjBvMRMwEQYDVQQDDAox +NjA5ODgyODE3MRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xGzAZBgNVBAsM +EuS4quS9k+aIt+m7juadqOePjTELMAkGA1UEBgwCQ04xETAPBgNVBAcMCFNoZW5a +aGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyofjHIn+PWAwM9Z +2/uv8hyRCP+nh8YcylUrRsgQtjoKi1HbRtj9AAwo0eBKgFZ3IviM2+4kQRctcN76 +cGBVGJh8Pvz7MreZgqTLPVHDLz5aVuyc7gzjCQ9o4B5pRjCdR3ORQuK1E+F65IGK +Ez2CjuVnZ+hGvsKhP2NExdhJJbLql3Za9G65Q0fU2z300g01wrRldv3lNr8cXWCr +7AAC491pqpa+yqGzibQustXPG4E3cFew/ZEvI+Said8YchrZmzlImaOS0JFGsSO+ +W0DAemP+k+UfZ8AoipQ4VZvL5MsEjnTk9MvmGiqXr4pS1iqJggWcKgk6g4w+FI5i +INRKkQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwZQYDVR0fBF4w +XDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2Ny +bD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyMA0G +CSqGSIb3DQEBCwUAA4IBAQCijzFxcaRNdoHzWKMlNNj/WI8j0tqaE6tublseIsZq +fzysnAuadSuawPVyHmPlaOD/wmB+sLkmQECgsgg0dloxETLdElQztSOok6GO+SLm +uRUgDbQJ5wpUu4YphdW2WFpXF2uLgbOvRBJGKiMsTY2FutyTlvj7kqQnhoBr5XWW +08cH40LvHte1/slRpoy0QM0zGZAGGMkNIgKGwlmF5jDuEIyZJs0lrNIJUOoxnZBU +4l7NZhZqckP8bWw0Dyfy4hGw/NAd7gI5nX9yiX185C6aqJr5Aw05HloJHNxMbtTj +5LtFybU6ZAazTWkY301c8CF7tlsaIglnsf/6odkSYn+u +-----END CERTIFICATE----- diff --git a/hai-cweb/src/main/resources/privatekey/apiclient_key.pem b/hai-cweb/src/main/resources/privatekey/apiclient_key.pem new file mode 100644 index 00000000..e1fb0608 --- /dev/null +++ b/hai-cweb/src/main/resources/privatekey/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC/Kh+Mcif49YDA +z1nb+6/yHJEI/6eHxhzKVStGyBC2OgqLUdtG2P0ADCjR4EqAVnci+Izb7iRBFy1w +3vpwYFUYmHw+/Psyt5mCpMs9UcMvPlpW7JzuDOMJD2jgHmlGMJ1Hc5FC4rUT4Xrk +gYoTPYKO5Wdn6Ea+wqE/Y0TF2EklsuqXdlr0brlDR9TbPfTSDTXCtGV2/eU2vxxd +YKvsAALj3Wmqlr7KobOJtC6y1c8bgTdwV7D9kS8j5JqJ3xhyGtmbOUiZo5LQkUax +I75bQMB6Y/6T5R9nwCiKlDhVm8vkywSOdOT0y+YaKpevilLWKomCBZwqCTqDjD4U +jmIg1EqRAgMBAAECggEBAIiEOnd/5o/iMwp+iXuR5/qM7/5vJGLP1iugWwF3Sof4 +NyN7V47m0va/uD75X/r6xKXSvjUpgfaB6M+cTVkHUn34F3KcE4AKobQsn3+w7iTE +8Jr26rMNvOzxdkHnNeMMQKWQIIKViB8kfTDGWaaX3K7ToN8Rf8QnFiRAbhKj/MjQ +GSXTcFJ9004jBGB+EawWC9rekZo2mHiEQWVYtDEYBnSJ9fQeg4b6Fo7IN/SMoLSM +HONNsq/uiQJjZr8Tm/5S1Wq1UTw1kiU9CyEG6dnsFkWSfrcrgeEbKHs7DATu0h9p +sVfvu/+fiDq9AoahDvfw1X+Pg4z3gy+PCH3Z3TNnEqkCgYEA9M09FSqvgDdzgtnz +xzF4dppIMxTfSls2Cg1+2Gdgj/P9ffi21LgYzPPIMpSiVGRY3QQiKfCq8Ba9+IWd +azB09z6D+pDjOUcQzGfH0bQsmYDGPNiO5o+oZYf0cr+GZ23NQBwDGZR8xjqjsBEB +XPWPMWOIN8gzoLo6O3VdxRhCUrMCgYEAx+jDoFCDKjvrJhAcUW6cKgXZ0izdLobK +4qDH26Afw2Ju2F/3b8e9+5L8WLqziFydvUQfcLl3btHrzctx2XE4YRRIiufAuEJz +8yBKjCCIGeHRdMtwVx8x+b1NQftTb8k/d5NmYnqZiYQyD3l+1R5Rmk1Zl2FkFut5 +EJCrxE+fP6sCgYBTxaRAiRHzw4YQ4jrtEH3TwGoyqNLcpCfy+rlMntvJh0pZAHK4 +iqNaB5ab0IdYb9qFD7QNPCGS9YVe9YJwOu3b6hXJ+ij34dzaxiz4Ezsr8IhmLAmC +1uhejk7Vsbrxy/5wEOXyrACi6VA4oSkhQZsV4KStyiH4v6HL1RcYqnuPxwKBgQCP +fxqlggWVFGun59qb7Xz1gTuo7YFbO3B5GxY7JYaHVqngcYqI12UdJ5YyDtp+YJTt +3e9/l/IOP2s3TvkLL4Vb0hZ8dvzUhwb6F0zLpzJq+bjDUKD0OLVD4kmJumFbFaeU +Kt9Mg1qg5p6Ukw6i5l+HFkzgKA2TkjVV2bMieFEEfwKBgHAxLffRyMer0vEzs7iq +Sm05FVoURm9wqeM0SCpXtXOtuXiDoxtw8jSCh/mXTiKAgEx3K/KO4fiBB5tCQKzA +TYcP72Jmqvuc4d/5FFH2sKuCiJ5s/XAlGo2zGSDbbkV7KJnRxOtYptW3Zt1VBQG1 +ECOoJd0HryxcP3qSddJHPMV9 +-----END PRIVATE KEY----- diff --git a/hai-service/pom.xml b/hai-service/pom.xml index b4de946e..24ce40c8 100644 --- a/hai-service/pom.xml +++ b/hai-service/pom.xml @@ -298,6 +298,11 @@ 1.1.3 compile + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.2.2 + diff --git a/hai-service/src/main/java/com/hai/common/utils/HttpsUtils.java b/hai-service/src/main/java/com/hai/common/utils/HttpsUtils.java index 006feccb..1fbd49c6 100644 --- a/hai-service/src/main/java/com/hai/common/utils/HttpsUtils.java +++ b/hai-service/src/main/java/com/hai/common/utils/HttpsUtils.java @@ -338,6 +338,45 @@ public class HttpsUtils { return null; } + public static JSONObject doWxH5PayPost(String apiUrl, Map body, Map header) { + CloseableHttpClient httpClient = null; + if (apiUrl.startsWith("https")) { + httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()) + .setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); + } else { + httpClient = HttpClients.createDefault(); + } + String httpStr = null; + CloseableHttpResponse response = null; + + try { + HttpPost httpPost = new HttpPost(apiUrl); + httpPost.setConfig(requestConfig); + for (Map.Entry entry : header.entrySet()) { + httpPost.setHeader(entry.getKey(), entry.getValue().toString()); + } + StringEntity stringEntity = new StringEntity(body.get("from").toString());// 解决中文乱码问题 + stringEntity.setContentEncoding("UTF-8"); + stringEntity.setContentType("application/x-www-form-urlencoded"); + httpPost.setEntity(stringEntity); + response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); + httpStr = EntityUtils.toString(entity, "UTF-8"); + return JSON.parseObject(httpStr); + } catch (Exception e) { + log.error(e.getMessage(),e); + } finally { + if (response != null) { + try { + EntityUtils.consume(response.getEntity()); + } catch (IOException e) { + log.error(e.getMessage(),e); + } + } + } + return null; + } + /** * 发送 POST 请求,JSON形式 *