Payment Open API


代收Java代码

<h3>印度代收 Demo</h3> <h2>可用于 INR BRL SAR COP TRY..</h2> <pre><code class="language-java">package com.aaa.inr; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; /** * 支付工具类,处理支付相关操作,比如生成签名和发送请求。 * 此类主要用于向支付服务发起请求并验证响应。 */ public class PaymentUtil { private static final String encodingCharset = &amp;quot;UTF-8&amp;quot;; // 编码字符集 private static final Logger logger = LoggerFactory.getLogger(PaymentUtil.class); // 日志记录器 /** * 生成签名,用于请求的安全性验证。 * * @param map 要签名的参数 * @param key 用于签名的密钥 * @return 生成的签名 */ public static String getSign(Map&amp;lt;String, String&amp;gt; map, String key) { List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); // 遍历参数,添加非空值的参数到列表 for (Map.Entry&amp;lt;String, String&amp;gt; entry : map.entrySet()) { if (entry.getValue() != null &amp;amp;&amp;amp; !&amp;quot;&amp;quot;.equals(entry.getValue())) { list.add(entry.getKey() + &amp;quot;=&amp;quot; + entry.getValue()); } } Collections.sort(list); // 对参数进行排序 StringBuilder sb = new StringBuilder(); // 拼接参数 for (int i = 0; i &amp;lt; list.size(); i++) { sb.append(list.get(i)); if (i &amp;lt; list.size() - 1) { sb.append(&amp;quot;&amp;amp;&amp;quot;); // 添加分隔符 } } sb.append(&amp;quot;&amp;amp;key=&amp;quot;).append(key); // 追加密钥 System.out.println(&amp;quot;加密前的字符串&amp;quot;+sb); return md5(sb.toString()).toUpperCase(); // 返回签名 } /** * 计算给定字符串的MD5哈希值。 * * @param value 要哈希的字符串 * @return MD5哈希的十六进制表示 */ private static String md5(String value) { try { byte[] data = value.getBytes(encodingCharset); // 将字符串转换为字节 MessageDigest md = MessageDigest.getInstance(&amp;quot;MD5&amp;quot;); // 获取MD5实例 return toHex(md.digest(data)); // 返回哈希值的十六进制表示 } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { logger.error(&amp;quot;MD5 error: {}&amp;quot;, e.getMessage()); // 记录错误日志 return null; } } /** * 将字节数组转换为十六进制字符串。 * * @param input 要转换的字节数组 * @return 成功转换后的十六进制字符串 */ private static String toHex(byte[] input) { StringBuilder output = new StringBuilder(input.length * 2); for (byte b : input) { int current = b &amp;amp; 0xFF; // 不考虑符号位 if (current &amp;lt; 16) { output.append(&amp;quot;0&amp;quot;); // 前补零 } output.append(Integer.toHexString(current)); // 转换为十六进制并添加到结果 } return output.toString(); } /**用于异步通知回来的参数再次生成sign和回调回来的sign比较 * 验证签名是否正确。 * * @param params 包含请求参数的映射 * @param key 用于生成签名的密钥 * @return 如果签名有效返回true,反之则返回false */ public static boolean validateSign(Map&amp;lt;String, String&amp;gt; params, String key) { // 移除原始签名 String receivedSign = (String) params.remove(&amp;quot;sign&amp;quot;); System.out.println(&amp;quot;移除签名:&amp;quot; + receivedSign); // 生成新的签名 String generatedSign = getSign(params, key); System.out.println(&amp;quot;新的签名:&amp;quot; + generatedSign); // 比较原始签名和生成的签名 return receivedSign.equals(generatedSign); } /** * 发送POST请求并获取响应。 * * @param params 请求参数的映射 * @param key 用于签名的密钥 * @return 响应数据的映射 * @throws IOException 如果请求过程发生I/O错误 */ public static Map&amp;lt;String, Object&amp;gt; sendRequest(Map&amp;lt;String, Object&amp;gt; params, String key,String url,boolean sendRequest) throws IOException { // 在请求参数中添加签名 params.put(&amp;quot;sign&amp;quot;, getSign(convertToStringMap(params), key)); ObjectMapper objectMapper = new ObjectMapper(); String jsonParams = objectMapper.writeValueAsString(params); // 将参数转换为JSON字符串 Map&amp;lt;String, Object&amp;gt; responseData = new HashMap&amp;lt;&amp;gt;(); if(sendRequest) {//判断是否发请求 URL connectionUrl = new URL (url); // 目标URL HttpURLConnection connection = (HttpURLConnection) connectionUrl.openConnection (); connection.setRequestMethod (&amp;quot;POST&amp;quot;); // 设置请求方式为POST connection.setRequestProperty (&amp;quot;Content-Type&amp;quot;, &amp;quot;application/json; charset=UTF-8&amp;quot;); // 设置请求头 connection.setDoOutput (true); // 允许输出 // 发送请求 try (OutputStream os = connection.getOutputStream ()) { byte[] input = jsonParams.getBytes (encodingCharset); os.write (input, 0, input.length); } int responseCode = connection.getResponseCode (); // 获取响应码 // 处理响应 if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader in = new BufferedReader (new InputStreamReader (connection.getInputStream ())); String inputLine; StringBuilder response = new StringBuilder (); while ((inputLine = in.readLine ()) != null) { response.append (inputLine); } in.close (); responseData = objectMapper.readValue (response.toString (), Map.class); // 解析响应数据 } else { throw new IOException (&amp;quot;HTTP Error: &amp;quot; + responseCode); // 抛出错误 } } return responseData; // 返回响应数据 } /** * 将具有Object值的参数映射转换为具有String值的映射。 * 这有助于生成签名并在内部使用。 * * @param params 参数的映射 * @return 仅包含String值的映射 */ private static Map&amp;lt;String, String&amp;gt; convertToStringMap(Map&amp;lt;String, Object&amp;gt; params) { Map&amp;lt;String, String&amp;gt; stringParams = new HashMap&amp;lt;&amp;gt;(); for (Map.Entry&amp;lt;String, Object&amp;gt; entry : params.entrySet()) { stringParams.put(entry.getKey(), entry.getValue().toString()); // 转换为字符串 } return stringParams; // 返回字符串映射 } }</code></pre> <pre><code class="language-java"> public static void main(String[] args) { ; try { Map&amp;lt;String, Object&amp;gt; signMap = new HashMap&amp;lt;&amp;gt;(); signMap.put(&amp;quot;mchNo&amp;quot;, &amp;quot;你的商户号&amp;quot;); //商户号 signMap.put(&amp;quot;appId&amp;quot;, &amp;quot;您的appid&amp;quot;); //appid LocalDateTime localDateTime = LocalDateTime.now(); signMap.put(&amp;quot;mchOrderNo&amp;quot;, &amp;quot;test_&amp;quot; + localDateTime.format(DateTimeFormatter.ofPattern(&amp;quot;yyyyMMddHHmmss&amp;quot;))); //商户号 signMap.put(&amp;quot;amount&amp;quot;, &amp;quot;10000&amp;quot;); //金额(分)单位 signMap.put(&amp;quot;customerName&amp;quot;, &amp;quot;ctiy&amp;quot;); //用户名 signMap.put(&amp;quot;customerEmail&amp;quot;, &amp;quot;ctiy@gmail.com&amp;quot;); //邮箱 signMap.put(&amp;quot;notifyUrl&amp;quot;,&amp;quot;http://googe.com&amp;quot;); //异步回调地址 signMap.put(&amp;quot;customerPhone&amp;quot;, &amp;quot;8197220658&amp;quot;); //手机号 signMap.put(&amp;quot;currency&amp;quot;, &amp;quot;INR&amp;quot;); //币种 INR BRL SAR COP... signMap.put(&amp;quot;clientIp&amp;quot;, &amp;quot;14.145.53.145&amp;quot;); //ipv4 long currentTimeMillis = System.currentTimeMillis(); //时间戳生成 signMap.put(&amp;quot;reqTime&amp;quot;,currentTimeMillis); //时间戳 ApiINRpayment handler = new ApiINRpayment(); // signMap.put(&amp;quot;extParam&amp;quot;, &amp;quot;{\&amp;quot;Payment_method\&amp;quot;:\&amp;quot;Card payment\&amp;quot;,\&amp;quot;MIS\&amp;quot;:\&amp;quot;DREAMO\&amp;quot;}&amp;quot;); //商户扩展位 signMap.put (&amp;quot;uid&amp;quot;,&amp;quot;用户ID&amp;quot;); //唯一uid // signMap.put (&amp;quot;expiredTime&amp;quot;,&amp;quot;3000&amp;quot;); //订单失败时间 String key = &amp;quot;您的appid私钥&amp;quot;; //appid私钥 Map&amp;lt;String, Object&amp;gt; result = PaymentUtil.sendRequest (signMap, key, &amp;quot;https://live.dreamo9.com/api/payment&amp;quot;, true); //true 发请求 false打印请求体 Map&amp;lt;String, Object&amp;gt; sign = new HashMap&amp;lt;&amp;gt;(); sign.putAll(signMap); String jsonString = JSONUtil.toJsonStr(sign); System.out.println(jsonString); System.out.println(&amp;quot;res&amp;quot;+result); } catch (Exception e) { e.printStackTrace(); } }</code></pre>

页面列表

ITEM_HTML