代收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 = &quot;UTF-8&quot;; // 编码字符集
private static final Logger logger = LoggerFactory.getLogger(PaymentUtil.class); // 日志记录器
/**
* 生成签名,用于请求的安全性验证。
*
* @param map 要签名的参数
* @param key 用于签名的密钥
* @return 生成的签名
*/
public static String getSign(Map&lt;String, String&gt; map, String key) {
List&lt;String&gt; list = new ArrayList&lt;&gt;();
// 遍历参数,添加非空值的参数到列表
for (Map.Entry&lt;String, String&gt; entry : map.entrySet()) {
if (entry.getValue() != null &amp;&amp; !&quot;&quot;.equals(entry.getValue())) {
list.add(entry.getKey() + &quot;=&quot; + entry.getValue());
}
}
Collections.sort(list); // 对参数进行排序
StringBuilder sb = new StringBuilder();
// 拼接参数
for (int i = 0; i &lt; list.size(); i++) {
sb.append(list.get(i));
if (i &lt; list.size() - 1) {
sb.append(&quot;&amp;&quot;); // 添加分隔符
}
}
sb.append(&quot;&amp;key=&quot;).append(key); // 追加密钥
System.out.println(&quot;加密前的字符串&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(&quot;MD5&quot;); // 获取MD5实例
return toHex(md.digest(data)); // 返回哈希值的十六进制表示
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
logger.error(&quot;MD5 error: {}&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; 0xFF; // 不考虑符号位
if (current &lt; 16) {
output.append(&quot;0&quot;); // 前补零
}
output.append(Integer.toHexString(current)); // 转换为十六进制并添加到结果
}
return output.toString();
}
/**用于异步通知回来的参数再次生成sign和回调回来的sign比较
* 验证签名是否正确。
*
* @param params 包含请求参数的映射
* @param key 用于生成签名的密钥
* @return 如果签名有效返回true,反之则返回false
*/
public static boolean validateSign(Map&lt;String, String&gt; params, String key) {
// 移除原始签名
String receivedSign = (String) params.remove(&quot;sign&quot;);
System.out.println(&quot;移除签名:&quot; + receivedSign);
// 生成新的签名
String generatedSign = getSign(params, key);
System.out.println(&quot;新的签名:&quot; + generatedSign);
// 比较原始签名和生成的签名
return receivedSign.equals(generatedSign);
}
/**
* 发送POST请求并获取响应。
*
* @param params 请求参数的映射
* @param key 用于签名的密钥
* @return 响应数据的映射
* @throws IOException 如果请求过程发生I/O错误
*/
public static Map&lt;String, Object&gt; sendRequest(Map&lt;String, Object&gt; params, String key,String url,boolean sendRequest) throws IOException {
// 在请求参数中添加签名
params.put(&quot;sign&quot;, getSign(convertToStringMap(params), key));
ObjectMapper objectMapper = new ObjectMapper();
String jsonParams = objectMapper.writeValueAsString(params); // 将参数转换为JSON字符串
Map&lt;String, Object&gt; responseData = new HashMap&lt;&gt;();
if(sendRequest) {//判断是否发请求
URL connectionUrl = new URL (url); // 目标URL
HttpURLConnection connection = (HttpURLConnection) connectionUrl.openConnection ();
connection.setRequestMethod (&quot;POST&quot;); // 设置请求方式为POST
connection.setRequestProperty (&quot;Content-Type&quot;, &quot;application/json; charset=UTF-8&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 (&quot;HTTP Error: &quot; + responseCode); // 抛出错误
}
}
return responseData; // 返回响应数据
}
/**
* 将具有Object值的参数映射转换为具有String值的映射。
* 这有助于生成签名并在内部使用。
*
* @param params 参数的映射
* @return 仅包含String值的映射
*/
private static Map&lt;String, String&gt; convertToStringMap(Map&lt;String, Object&gt; params) {
Map&lt;String, String&gt; stringParams = new HashMap&lt;&gt;();
for (Map.Entry&lt;String, Object&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&lt;String, Object&gt; signMap = new HashMap&lt;&gt;();
signMap.put(&quot;mchNo&quot;, &quot;你的商户号&quot;); //商户号
signMap.put(&quot;appId&quot;, &quot;您的appid&quot;); //appid
LocalDateTime localDateTime = LocalDateTime.now();
signMap.put(&quot;mchOrderNo&quot;, &quot;test_&quot; + localDateTime.format(DateTimeFormatter.ofPattern(&quot;yyyyMMddHHmmss&quot;))); //商户号
signMap.put(&quot;amount&quot;, &quot;10000&quot;); //金额(分)单位
signMap.put(&quot;customerName&quot;, &quot;ctiy&quot;); //用户名
signMap.put(&quot;customerEmail&quot;, &quot;ctiy@gmail.com&quot;); //邮箱
signMap.put(&quot;notifyUrl&quot;,&quot;http://googe.com&quot;); //异步回调地址
signMap.put(&quot;customerPhone&quot;, &quot;8197220658&quot;); //手机号
signMap.put(&quot;currency&quot;, &quot;INR&quot;); //币种 INR BRL SAR COP...
signMap.put(&quot;clientIp&quot;, &quot;14.145.53.145&quot;); //ipv4
long currentTimeMillis = System.currentTimeMillis(); //时间戳生成
signMap.put(&quot;reqTime&quot;,currentTimeMillis); //时间戳
ApiINRpayment handler = new ApiINRpayment();
// signMap.put(&quot;extParam&quot;, &quot;{\&quot;Payment_method\&quot;:\&quot;Card payment\&quot;,\&quot;MIS\&quot;:\&quot;DREAMO\&quot;}&quot;); //商户扩展位
signMap.put (&quot;uid&quot;,&quot;用户ID&quot;); //唯一uid
// signMap.put (&quot;expiredTime&quot;,&quot;3000&quot;); //订单失败时间
String key = &quot;您的appid私钥&quot;; //appid私钥
Map&lt;String, Object&gt; result = PaymentUtil.sendRequest (signMap, key, &quot;https://live.dreamo9.com/api/payment&quot;, true); //true 发请求 false打印请求体
Map&lt;String, Object&gt; sign = new HashMap&lt;&gt;();
sign.putAll(signMap);
String jsonString = JSONUtil.toJsonStr(sign);
System.out.println(jsonString);
System.out.println(&quot;res&quot;+result);
} catch (Exception e) {
e.printStackTrace();
}
}</code></pre>