java微信支付v3系列——9.微信支付之商家转账API

1

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 toMap() {

Map map = new HashMap<>();

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 params = request.toMap();

return new Request.Builder()

.url(url)

.post(RequestBody.create(MediaType.get("application/x-www-form-urlencoded"), getParamString(params)))

.build();

}

private String getParamString(Map params) {

StringBuilder sb = new StringBuilder();

for (Map.Entry entry : params.entrySet()) {

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 params) {

//1. 将所有参数按key=value的形式排序 List> list = new ArrayList<>(params.entrySet());

Collections.sort(list, (o1, o2) -> o1.getKey().compareTo(o2.getKey()));

//2. 将所有参数拼接成一个字符串 StringBuilder sb = new StringBuilder();

for (Map.Entry entry : list) {

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来实现的。

* 在实际使用中,需要根据具体的业务需求进行调整和扩展。

* 需要注意签名验证的正确性和转账请求参数的完整性。

转账支付java微信微信支付微信支付v3

版权声明:除非特别标注,否则均为网络文章,侵权请联系站长删除。

上一篇 WAP调用微信支付https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1

下一篇 H5网站接入微信支付(H5支付+JSAPI支付)