java微信支付v3系列——9.微信支付之商家转账API
微信支付之商家转账API
在微信支付的V3系列中,我们已经介绍了如何发起创建支付订单的请求。在本文中,我们将详细描述如何使用微信支付的商家转账API。
1. 封装转账请求参数
首先,我们需要封装转账请求参数。转账请求参数包括以下几个部分:
* `mch_appid`:商户appid* `mchid`:商户号* `nonce_str`:随机字符串* `partner_trade_no`:商家转账订单号* `pay_mch_id`:支付商户号* `re_user_name`:收款用户名称* `amount`:转账金额* `desc`:转账描述```javaimport java.util.HashMap;
import java.util.Map;
public class TransferRequest {
private String mch_appid;
private String mchid;
private String nonce_str;
private String partner_trade_no;
private String pay_mch_id;
private String re_user_name;
private String amount;
private String desc;
public TransferRequest(String mch_appid, String mchid, String nonce_str, String partner_trade_no, String pay_mch_id, String re_user_name, String amount, String desc) {
this.mch_appid = mch_appid;
this.mchid = mchid;
this.nonce_str = nonce_str;
this.partner_trade_no = partner_trade_no;
this.pay_mch_id = pay_mch_id;
this.re_user_name = re_user_name;
this.amount = amount;
this.desc = desc;
}
public Map
Map
map.put("mch_appid", mch_appid);
map.put("mchid", mchid);
map.put("nonce_str", nonce_str);
map.put("partner_trade_no", partner_trade_no);
map.put("pay_mch_id", pay_mch_id);
map.put("re_user_name", re_user_name);
map.put("amount", amount);
map.put("desc", desc);
return map;
}
}
```
2. 获取请求对象发起请求
接下来,我们需要获取一个请求对象,然后使用这个对象发起请求。我们可以使用OkHttp库来实现这一点。
```javaimport ok ok class TransferRequestSender {
private OkHttpClient client;
public TransferRequestSender() {
this.client = new OkHttpClient();
}
public Request getTransferRequest(TransferRequest request) {
String url = " Map
return new Request.Builder()
.url(url)
.post(RequestBody.create(MediaType.get("application/x-www-form-urlencoded"), getParamString(params)))
.build();
}
private String getParamString(Map
StringBuilder sb = new StringBuilder();
for (Map.Entry
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
return sb.toString().substring(0, sb.length() -1);
}
public Response sendRequest(Request request) throws IOException {
return client.newCall(request).execute();
}
}
```
3. 完成签名验证发送请求
在发起请求之前,我们需要完成签名验证。我们可以使用微信支付的API来实现这一点。
```javaimport java.security.MessageDigest;
import java.util.Map;
public class SignatureValidator {
public boolean validateSignature(Map
//1. 将所有参数按key=value的形式排序 List
Collections.sort(list, (o1, o2) -> o1.getKey().compareTo(o2.getKey()));
//2. 将所有参数拼接成一个字符串 StringBuilder sb = new StringBuilder();
for (Map.Entry
sb.append(entry.getKey()).append("=").append(entry.getValue());
}
//3. 使用MD5算法对这个字符串进行加密 String signature = getMd5(sb.toString());
//4. 将加密后的结果与传入的签名值进行比较 return signature.equals(params.get("sign"));
}
private String getMd5(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(str.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(Integer.toHexString(0xff & b));
}
return sb.toString();
} catch (Exception e) {
return "";
}
}
}
```
4. 解析数据
如果转账成功,我们需要解析返回的数据。
```javaimport com.google.gson.Gson;
public class TransferResponseParser {
public TransferResponse parse(String response) {
Gson gson = new Gson();
return gson.fromJson(response, TransferResponse.class);
}
}
```
5. 如果转账失败则返回提示信息给用户
如果转账失败,我们需要返回一个提示信息给用户。
```javapublic class TransferResult {
private String result_code;
private String err_code_des;
public TransferResult(String result_code, String err_code_des) {
this.result_code = result_code;
this.err_code_des = err_code_des;
}
public String getResultCode() {
return result_code;
}
public String getErrCodeDes() {
return err_code_des;
}
}
```
完整的示例代码
```javapublic class Main {
public static void main(String[] args) throws IOException {
//1. 封装转账请求参数 TransferRequest request = new TransferRequest(
"your_mch_appid",
"your_mch_id",
getNonceStr(),
"your_partner_trade_no",
"your_pay_mch_id",
"收款用户名称",
"100.00",
"转账描述"
);
//2. 获取请求对象发起请求 TransferRequestSender sender = new TransferRequestSender();
Request requestObject = sender.getTransferRequest(request);
//3. 完成签名验证发送请求 SignatureValidator validator = new SignatureValidator();
if (!validator.validateSignature(request.toMap())) {
System.out.println("签名验证失败");
return;
}
Response response = sender.sendRequest(requestObject);
String responseBody = response.body().string();
//4. 解析数据 TransferResponseParser parser = new TransferResponseParser();
TransferResponse transferResponse = parser.parse(responseBody);
//5. 如果转账失败则返回提示信息给用户 if (transferResponse.getResultCode().equals("FAIL")) {
System.out.println("转账失败");
return;
}
System.out.println("转账成功");
}
private static String getNonceStr() {
return UUID.randomUUID().toString();
}
}
```
注意
* 这个示例代码是基于微信支付V3系列的API来实现的。
* 在实际使用中,需要根据具体的业务需求进行调整和扩展。
* 需要注意签名验证的正确性和转账请求参数的完整性。