微信支付——统一下单——java

统一下单接口:这边是用户购买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());
		}
	}
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值