统一下单接口:这边是用户购买vip的一个支付代码,使用统一下单,主要是jsapi支付
微信官方地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
@ApiOperation、@ApiImplicitParams是使用了swagger,没有配置swagger的小伙伴,可以直接删除
wxPay:
import com.yys.szcp.config.jwt.JwtIgnore;
import com.yys.szcp.entity.*;
import com.yys.szcp.service.*;
import com.yys.szcp.utils.ResultUtil;
import com.yys.szcp.utils.WebUtils;
import com.yys.szcp.utils.signUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@Api(tags = "APP微信支付")
@Controller
@RequestMapping("app/user")
public class WeChatPayController {
private static final Logger logger = LoggerFactory.getLogger(WeChatPayController.class);
private static final String UNURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
@Autowired
private SharingConfigService sharingConfigService;
@Autowired
private TAppUserService userService;
@Resource
private TMemberService tMemberService;
@Autowired
private TCardService tCardService;
signUtil signPay = new signUtil();
/**
* 用户vip充值
*
* @param request
* @param userId
* @param transactionAmount
* @return
*/
@RequestMapping(value = "/vipPayDetails")
@JwtIgnore // 用户vip充值
@ResponseBody
@ApiOperation(value = "充值vip", notes = "充值vip")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户ID", dataTypeClass = Integer.class, required = true),
@ApiImplicitParam(name = "transactionAmount", value = "支付金额", dataTypeClass = Double.class, required = true),
@ApiImplicitParam(name = "cardId", value = "卡片id", dataTypeClass = Integer.class)
})
public ResultUtil wxPay(HttpServletRequest request,
@RequestParam("userId") String userId,
@RequestParam("transactionAmount") Double transactionAmount,
Integer cardId
) {
try {
if (Objects.isNull(userId) || Objects.isNull(transactionAmount)) {
return ResultUtil.error("参数不能为空");
}
TAppUser userInfo = userService.getById(userId);
if (Objects.isNull(userInfo)) {
return ResultUtil.error("用户不存在");
}
//创建条件
SortedMap<String, String> paraMap = new TreeMap<String, String>();
//设置body变量 (支付成功显示在微信支付 商品详情中)
String body = "VIP";
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
Calendar calendar = Calendar.getInstance();
String dateName = df.format(calendar.getTime());
int v = (int) ((Math.random() * 9 + 1) * 1000000);
//设置商户订单号
String outTradeNo = dateName + v;
//设置随机字符串
String nonceStr = (UUID.randomUUID()).toString().replaceAll("-", "");
//设置请求参数
String appid = sharingConfigService.getGlobalConfig(SharingConfig.WECHAT_APPID);
paraMap.put("appid", appid);
//设置请求参数(商户号)
String mch_id = sharingConfigService.getGlobalConfig(SharingConfig.MCH_ID);
paraMap.put("mch_id", mch_id);
//设置请求参数(随机字符串)
paraMap.put("nonce_str", nonceStr);
//设置请求参数(商品描述)
paraMap.put("body", body);
//设置请求参数(商户订单号)
paraMap.put("out_trade_no", outTradeNo);
//设置请求参数(总金额)
paraMap.put("total_fee", String.valueOf(transactionAmount.intValue()));
//设置请求参数(终端IP)
paraMap.put("spbill_create_ip", WebUtils.getRemoteAddr(request));
//设置请求参数(通知地址)
String notifyHost = sharingConfigService.getGlobalConfig(SharingConfig.DOMAIN_HOST);
paraMap.put("notify_url", notifyHost + "/app/user/jsapiPayCallback");
//设置请求参数(交易类型)
paraMap.put("trade_type", "JSAPI");
paraMap.put("attach", userInfo.getId().toString());
//设置请求参数(openid)(在接口文档中 该参数 是否必填项 但是一定要注意 如果交易类型设置成'JSAPI'则必须传入openid)
paraMap.put("openid", userInfo.getWxOpenId());
//调用逻辑传入参数按照字段名的 ASCII 码从小到大排序(字典序)
String stringA = WebUtils.formatUrlMap(paraMap, false, false);
//第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。(签名)
String key = sharingConfigService.getGlobalConfig(SharingConfig.MCH_KEY);
String sign = WebUtils.MD5(stringA + "&key=" + key).toUpperCase();
//将参数 编写XML格式
StringBuffer paramBuffer = new StringBuffer();
paramBuffer.append("<xml>");
paramBuffer.append("<appid>" + appid + "</appid>");
paramBuffer.append("<mch_id>" + mch_id + "</mch_id>");
paramBuffer.append("<nonce_str>" + paraMap.get("nonce_str") + "</nonce_str>");
paramBuffer.append("<sign>" + sign + "</sign>");
paramBuffer.append("<body>" + body + "</body>");
paramBuffer.append("<out_trade_no>" + paraMap.get("out_trade_no") + "</out_trade_no>");
paramBuffer.append("<total_fee>" + paraMap.get("total_fee") + "</total_fee>");
paramBuffer.append("<spbill_create_ip>" + paraMap.get("spbill_create_ip") + "</spbill_create_ip>");
paramBuffer.append("<notify_url>" + paraMap.get("notify_url") + "</notify_url>");
paramBuffer.append("<trade_type>" + paraMap.get("trade_type") + "</trade_type>");
paramBuffer.append("<attach>" + paraMap.get("attach") + "</attach>");
paramBuffer.append("<openid>" + paraMap.get("openid") + "</openid>");
paramBuffer.append("</xml>");
try {
//发送请求(POST)(获得数据包ID)(这有个注意的地方 如果不转码成ISO8859-1则会告诉你body不是UTF8编码 就算你改成UTF8编码也一样不好使 所以修改成ISO8859-1)
Map<String, String> map = WebUtils.doXMLParse(WebUtils.getRemotePortData(UNURL, new String(paramBuffer.toString().getBytes(), "ISO8859-1")));
//应该创建 支付表数据
if (map != null) {
if (!map.get("result_code").equals("FAIL")) {
//在这里填写自己的业务代码
//************************
//boolean sqlRow = tMemberService.save(tMember);
//if (sqlRow) {
System.out.println("微信 统一下单 接口调用成功 并且新增支付信息成功");
ResultUtil prepay_id = signPay.generateSignature(appid, key, map.get("prepay_id"));
return prepay_id;
//}
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return ResultUtil.error("支付失败");
} catch (Exception e) {
return ResultUtil.error("支付失败");
}
}
}
回调
paycallback:
/**
* 充值vip回调
*
* @param request
* @param response
*/
@RequestMapping(value = "/jsapiPayCallback")
@JwtIgnore
@ResponseBody
@ApiOperation(value = "充值vip回调", notes = "充值vip回调")
public void payCallback(HttpServletRequest request, HttpServletResponse response) {
System.out.println("微信回调接口方法 start");
String inputLine = "";
String notityXml = "";
try {
while ((inputLine = request.getReader().readLine()) != null) {
notityXml += inputLine;
}
//关闭流
request.getReader().close();
logger.info("微信回调内容信息:" + notityXml);
//解析成Map
Map<String, String> map = WebUtils.doXMLParse(notityXml);
//判断 支付是否成功
if ("SUCCESS".equals(map.get("result_code"))) {
//获得 返回的商户订单号
String total_fee = map.get("total_fee");
String outTradeNo = map.get("out_trade_no");
String attach = map.get("attach");
//TMember tMember = tMemberService.findPayDetails(outTradeNo);
//TAppUser appUserByWxOpenId = userService.getById(attach);
//if (!Objects.isNull(tMember) && tMember.getPayStatus() == 0) {
//处理业务逻辑
//boolean sqlRow = userService.updateById(appUserByWxOpenId);
//logger.info("已修改vip状态:{}", appUserByWxOpenId.getIsVip());
//if (sqlRow) {
signPay.returnResult(response);
//}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
SharingConfigService:主要获取配置,例如appid等
userService、tMemberService、tCardService:做相关业务处理
signUtil:
package com.yys.szcp.utils;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;
/**
* @Author jiujiu
* @Date 2023-12-09
**/
public class signUtil {
/**
* 生成签名
*
* @param prepay_id
* @return
*/
public ResultUtil generateSignature(String appid, String key, String prepay_id) {
//实例化返回对象
net.sf.json.JSONObject resultJson = new net.sf.json.JSONObject();
//获得参数(微信统一下单接口生成的prepay_id )
String timeStamp = Long.valueOf(System.currentTimeMillis()).toString();
//创建 随机串
String nonceStr = (UUID.randomUUID()).toString().replaceAll("-", "");
//创建 MD5
String signType = "MD5";
//创建hashmap(用户获得签名)
SortedMap<String, String> paraMap = new TreeMap<String, String>();
//设置(小程序ID)(这块一定要是大写)
paraMap.put("appId", appid);
//设置(时间戳)
paraMap.put("timeStamp", timeStamp);
//设置(随机串)
paraMap.put("nonceStr", nonceStr);
//设置(数据包)
paraMap.put("package", "prepay_id=" + prepay_id);
//设置(签名方式)
paraMap.put("signType", signType);
//调用逻辑传入参数按照字段名的 ASCII 码从小到大排序(字典序)
String stringA = WebUtils.formatUrlMap(paraMap, false, false);
//第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。(签名)
String sign = WebUtils.MD5(stringA + "&key=" + key).toUpperCase();
if (StringUtils.isNotBlank(sign)) {
//返回签名信息
resultJson.put("paySign", sign);
resultJson.put("appId", appid);
//返回随机串(这个随机串是新创建的)
resultJson.put("nonceStr", nonceStr);
//返回时间戳
resultJson.put("timeStamp", timeStamp);
//返回数据包
resultJson.put("package", "prepay_id=" + prepay_id);
}
return ResultUtil.success(resultJson);
}
public void returnResult(HttpServletResponse response) throws IOException {
//访问DB
StringBuffer buffer = new StringBuffer();
buffer.append("<xml>");
buffer.append("<return_code>SUCCESS</return_code>");
buffer.append("<return_msg>OK</return_msg>");
buffer.append("</xml>");
//给微信服务器返回 成功标示 否则会一直询问 咱们服务器 是否回调成功
PrintWriter writer = response.getWriter();
//返回
writer.print(buffer.toString());
}
}
WebUtils:
package com.yys.szcp.utils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang.StringUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class WebUtils {
private static final Logger log = LoggerFactory.getLogger(WebUtils.class);
/**
* 获取系统上下文路径
* @param request
* @return
*/
public static String getContextPath(HttpServletRequest request) {
return request.getSession().getServletContext().getContextPath();
}
/**
* 获取用户的真正IP地址
* @param request
* @return
*/
public static String getRemoteAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (StringUtils.isBlank(ip) || StringUtils.equalsIgnoreCase(ip, "unknown")) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(ip) || StringUtils.equalsIgnoreCase(ip, "unknown")) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(ip) || StringUtils.equalsIgnoreCase(ip, "unknown")) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
// 民安赖波经理提供的从head的什么值获取IP地址
if (StringUtils.isBlank(ip) || StringUtils.equalsIgnoreCase(ip, "unknown")) {
ip = request.getHeader("X-Real-IP");
}
if (StringUtils.isBlank(ip) || StringUtils.equalsIgnoreCase(ip, "unknown")) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(ip) || StringUtils.equalsIgnoreCase(ip, "unknown")) {
ip = request.getRemoteAddr();
}
if (StringUtils.isNotBlank(ip) && StringUtils.indexOf(ip, ",") > 0) {
String[] ipArray = StringUtils.split(ip, ",");
ip = ipArray[0];
}
return ip;
}
/**
* 获取本地IP地址
*/
public static String getLocalAddr() throws UnknownHostException {
InetAddress addr = InetAddress.getLocalHost();
return addr.getHostAddress();
}
/**
* 处理乱码
*/
public static String encodingHelp(String s) throws Exception {
return new String(s.getBytes("ISO-8859-1"), "UTF-8");
}
/**
* 对ajax提交过来的参数进行解码
* @param s
* @return
* @throws Exception
*/
public static String ajaxDecode(String s) throws Exception {
return URLDecoder.decode(s, "UTF8");
}
/**
* 页面弹出提示信息
* @param response
* @param msg
* @throws Exception
*/
public static void alertMsg(HttpServletResponse response, String msg) throws Exception {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
StringBuilder sb = new StringBuilder();
sb.append("<script type='text/javascript'>");
sb.append("alert(\""+msg+"\");");
sb.append("</script>");
PrintWriter out = response.getWriter();
out.print(sb.toString());
out.close();
}
/**
* 获取request
*/
public static HttpServletRequest getRequest()
{
try
{
return getRequestAttributes().getRequest();
}
catch (Exception e)
{
return null;
}
}
public static ServletRequestAttributes getRequestAttributes()
{
try
{
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
return (ServletRequestAttributes) attributes;
}
catch (Exception e)
{
return null;
}
}
// public static HttpServletRequest getRequest() {
// return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// }
/**
* 判断是否为ajax请求
* @param request
* @return
*/
public static boolean isAjaxReqest(HttpServletRequest request) {
if ((request.getHeader("accept") != null && (request.getHeader("accept").indexOf("application/json") > -1) || (request.getHeader("X-Requested-With") != null && request.getHeader(
"X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
return true;
}
return false;
}
public static String MD5(String sourceStr) {
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(sourceStr.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0) {
i += 256;
}
if (i < 16) {
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
result = buf.toString();
} catch (NoSuchAlgorithmException e) {
System.out.println(e);
}
return result;
}
@SuppressWarnings("rawtypes")
public static Map<String, String> doXMLParse(String strxml) throws Exception {
if (null == strxml || "".equals(strxml)) {
return null;
}
Map<String, String> m = new HashMap<String, String>();
InputStream in = String2Inputstream(strxml);
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while (it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = "";
List children = e.getChildren();
if (children.isEmpty()) {
v = e.getTextNormalize();
} else {
v = getChildrenText(children);
}
m.put(k, v);
}
//关闭流
in.close();
return m;
}
@SuppressWarnings("rawtypes")
private static String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if (!children.isEmpty()) {
Iterator it = children.iterator();
while (it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append("<" + name + ">");
if (!list.isEmpty()) {
sb.append(getChildrenText(list));
}
sb.append(value);
sb.append("</" + name + ">");
}
}
return sb.toString();
}
public static InputStream String2Inputstream(String str) {
return new ByteArrayInputStream(str.getBytes());
}
/**
* 3 * 方法名: getRemotePortData
* 4 * 描述: 发送远程请求 获得代码示例
* 5 * 参数: @param urls 访问路径
* 6 * 参数: @param param 访问参数-字符串拼接格式, 例:port_d=10002&port_g=10007&country_a=
* 7 * 创建人: Xia ZhengWei
* 8 * 创建时间: 2017年3月6日 下午3:20:32
* 9 * 版本号: v1.0
* 10 * 返回类型: String
* 11
*/
public static String getRemotePortData(String urls, String param) {
try {
URL url = new URL(urls);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置连接超时时间
conn.setConnectTimeout(30000);
// 设置读取超时时间
conn.setReadTimeout(30000);
conn.setRequestMethod("POST");
if (!StringUtils.isBlank(param)) {
conn.setRequestProperty("Origin", "https://sirius.searates.com");// 主要参数
conn.setRequestProperty("Referer", "https://sirius.searates.com/cn/port?A=ChIJP1j2OhRahjURNsllbOuKc3Y&D=567&G=16959&shipment=1&container=20st&weight=1&product=0&request=&weightcargo=1&");
conn.setRequestProperty("X-Requested-With", "XMLHttpRequest");// 主要参数
}
// 需要输出
conn.setDoInput(true);
// 需要输入
conn.setDoOutput(true);
// 设置是否使用缓存
conn.setUseCaches(false);
// 设置请求属性
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
conn.setRequestProperty("Charset", "UTF-8");
if (!StringUtils.isBlank(param)) {
// 建立输入流,向指向的URL传入参数
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(param);
dos.flush();
dos.close();
}
// 输出返回结果
InputStream input = conn.getInputStream();
int resLen = 0;
byte[] res = new byte[1024];
StringBuilder sb = new StringBuilder();
while ((resLen = input.read(res)) != -1) {
sb.append(new String(res, 0, resLen));
}
return sb.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
/**
* 发送ajax
* @param response
* @param code
* @param msg
* @param data
* @throws Exception
*/
/*public static void ajaxJson(HttpServletResponse response, Integer code, String msg) throws Exception {
String json = JsonUtils.objectToJson(new ResultUtil(code, msg));
response.setContentType("text/json; charset=utf-8");
response.setHeader("Cache-Control", "no-cache"); // 取消浏览器缓存
PrintWriter out = response.getWriter();
out.print(json);
out.flush();
out.close();
}*/
/**
2 *
3 * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成url参数串<br>
4 * 实现步骤: <br>
5 *
6 * @param paraMap 要排序的Map对象
7 * @param urlEncode 是否需要URLENCODE
8 * @param keyToLower 是否需要将Key转换为全小写
9 * true:key转化成小写,false:不转化
10 * @return
11 */
public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) {
String buff = "";
Map<String, String> tmpMap = paraMap;
try
{
List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());
// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>()
{
@Override
public int compare (Map.Entry < String, String > o1, Map.Entry < String, String > o2)
{
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});
// 构造URL 键值对的格式
StringBuilder buf = new StringBuilder();
for (Map.Entry<String, String> item : infoIds)
{
if (StringUtils.isNotBlank(item.getKey()))
{
String key = item.getKey();
String val = item.getValue();
if (urlEncode)
{
val = URLEncoder.encode(val, "utf-8");
}
if (keyToLower)
{
buf.append(key.toLowerCase() + "=" + val);
} else
{
buf.append(key + "=" + val);
}
buf.append("&");
}
}
buff = buf.toString();
if (buff.isEmpty() == false)
{
buff = buff.substring(0, buff.length() - 1);
}
} catch(Exception e)
{
return null;
}
return buff;
}
public static String md5(String msg) {
if (null == msg) {
return null;
}
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] out = md.digest(msg.getBytes());
String str = org.apache.commons.codec.binary.Base64.encodeBase64String(out);
return str;
} catch (Exception e) {
return "";
}
}
public static Map<String, String> sendPay(String url, Map<String, Object> params) throws Exception {
try {
// String payload = objectMapper.writeValueAsString(params);
// 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 将"pay_amount"和"valid_time"字段的值从字符串转换为数字
params.put("total_amount", Integer.parseInt((String) params.get("total_amount")));
params.put("valid_time", Integer.parseInt((String) params.get("valid_time")));
// 将Map转换回JSON字符串
String modifiedJsonStr = objectMapper.writeValueAsString(params);
// 打印修改后的JSON字符串
System.out.println(modifiedJsonStr);
URL apiUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
OutputStream outputStream = connection.getOutputStream();
outputStream.write(modifiedJsonStr.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
outputStream.close();
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
JsonNode jsonResponse = objectMapper.readTree(connection.getInputStream());
// 解析响应JSON数据并返回一个Map<String, String>对象
// 将JsonNode转换为Map对象
Map<String, String> responseMap = objectMapper.convertValue(jsonResponse, Map.class);
return responseMap;
} else {
String errorMessage = responseCode + " - " + connection.getResponseMessage();
return Collections.singletonMap("err_no", errorMessage);
}
} catch (IOException e) {
// 处理异常并返回适当的错误信息
e.printStackTrace();
return Collections.singletonMap("error", "请求失败:" + e.getMessage());
}
}
public static Map<String, String> send(String url, Map<String, Object> params) throws Exception {
try {
// 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 将"withdraw_amount"字段的值从字符串转换为数字
// params.put("withdraw_amount", Integer.parseInt((String) params.get("withdraw_amount")));
// 将Map转换回JSON字符串
String modifiedJsonStr = objectMapper.writeValueAsString(params);
// 打印修改后的JSON字符串
System.out.println(modifiedJsonStr);
URL apiUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
OutputStream outputStream = connection.getOutputStream();
outputStream.write(modifiedJsonStr.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
outputStream.close();
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
JsonNode jsonResponse = objectMapper.readTree(connection.getInputStream());
// 解析响应JSON数据并返回一个Map<String, String>对象
Map<String, String> responseMap = objectMapper.convertValue(jsonResponse, Map.class);
return responseMap;
} else {
String errorMessage = responseCode + " - " + connection.getResponseMessage();
return Collections.singletonMap("err_no", errorMessage);
}
} catch (IOException e) {
// 处理异常并返回适当的错误信息
e.printStackTrace();
return Collections.singletonMap("error", "请求失败:" + e.getMessage());
}
}
}