概述
提供企業(yè)向用戶付款的功能,支持企業(yè)通過API接口付款篡撵,或通過微信支付商戶平臺網(wǎng)頁功能操作付款判莉。
企業(yè)付款有兩種方式
- 企業(yè)付款到零錢
- 企業(yè)付款到銀行
開通條件:
- 商戶號已入駐90日
- 商戶號有30天連續(xù)正常交易
- 登錄微信支付商戶平臺-產(chǎn)品中心,開通企業(yè)付款育谬。
付款之前需要充值:
在調(diào)用API接口付款或通過微信支付商戶平臺網(wǎng)頁功能操作付款之前需要登錄微信支付商戶平臺,通過網(wǎng)頁充值功能充值(商戶平臺-交易中心)
充值
帮哈、商戶平臺網(wǎng)頁功能操作付款
膛檀、其他限制條件
詳細介紹請參考官方文檔
下面就來介紹下如何通過API接口付款
證書下載
參考安全規(guī)范-3.商戶證書
下載:微信商戶平臺(pay.weixin.qq.com)–>賬戶中心–>賬戶設置–>API安全–>證書下載
企業(yè)付款到零錢
付款到零錢需要openId
如何獲取openId呢?參考授權獲取用戶信息
IJPay中的接口
https://gitee.com/Javen205/IJPay
https://github.com/Javen205/IJPay
- 企業(yè)付款到零錢
- 查詢企業(yè)付款
/**
* 企業(yè)付款到零錢
* @param params
* 請求參數(shù)
* @param certPath
* 證書文件目錄
* @param certPassword
* 證書密碼
* @return {String}
*/
public static String transfers(Map<String, String> params, String certPath, String certPassword) {
return WxPayApi.doPostSSL(TRANSFERS_URL, params, certPath, certPassword);
}
/**
* 查詢企業(yè)付款到零錢
* @param params
* 請求參數(shù)
* @param certPath
* 證書文件目錄
* @param certPassword
* 證書密碼
* @return {String}
*/
public static String getTransferInfo(Map<String, String> params, String certPath, String certPassword) {
return WxPayApi.doPostSSL(GETTRANSFERINFO_URL, params, certPath, certPassword);
}
代碼示例
https://github.com/Javen205/IJPay-Demo
/**
* 企業(yè)付款到零錢
*/
public void transfers() {
String openId = getSessionAttr("openId");
Map<String, String> params = new HashMap<String, String>();
params.put("mch_appid", appid);
params.put("mchid", mch_id);
String nonceStr = String.valueOf(System.currentTimeMillis());
params.put("nonce_str", nonceStr);
String partnerTradeNo = String.valueOf(System.currentTimeMillis());
params.put("partner_trade_no", partnerTradeNo);
params.put("openid", openId);
params.put("check_name", "NO_CHECK");
params.put("amount", "100");
params.put("desc", "IJPay提現(xiàn)測試-By Javen");
String ip = IpKit.getRealIp(getRequest());
if (StrKit.isBlank(ip)) {
ip = "127.0.0.1";
}
params.put("spbill_create_ip", ip);
params.put("sign", PaymentKit.createSign(params, partnerKey));
System.out.println("certPath>"+certPath);
// 提現(xiàn)
String transfers = WxPayApi.transfers(params, certPath, mch_id);
log.info("提現(xiàn)結(jié)果:" + transfers);
System.out.println("提現(xiàn)結(jié)果:" + transfers);
Map<String, String> map = PaymentKit.xmlToMap(transfers);
String return_code = map.get("return_code");
String result_code = null;
if (("SUCCESS").equals(return_code)) {
result_code = map.get("result_code");
if (("SUCCESS").equals(result_code)) {
//提現(xiàn)成功
} else {
//提現(xiàn)失敗
}
}
renderText(transfers);
}
/**
* 查詢企業(yè)付款到零錢
*/
public void transferInfo() {
try {
String partner_trade_no = getPara("partner_trade_no");
Map<String, String> params = new HashMap<String, String>();
params.put("nonce_str", System.currentTimeMillis()+"");
params.put("partner_trade_no", partner_trade_no);
params.put("mch_id", mch_id);
params.put("appid", appid);
params.put("sign", PaymentKit.createSign(params, partnerKey));
String transferInfo = WxPayApi.getTransferInfo(params , certPath, mch_id);
renderText(transferInfo);
} catch (Exception e) {
e.printStackTrace();
renderText(e.getMessage());
}
}
企業(yè)付款到銀行卡
- 需要雙向證書
- 收款方銀行卡號、用戶姓名需要使用RSA算法加密
- 接口默認輸出PKCS#1格式的公鑰咖刃,Java RSA加密需要使用PKCS#8 不然會出現(xiàn)異常algid parse error, not a sequence? 官方文檔
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<result_code><![CDATA[SUCCESS]]></result_code>
<mch_id><![CDATA[1262075601]]></mch_id>
<pub_key><![CDATA[-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA6Bl76IwSvBTiibZ+CNRUA6BfahMshZ0WJpHD1GpmvcQjeN6Yrv6c
9eIl6gB4nU3isN7bn+LmoVTpH1gHViaV2YyG/zXj4z4h7r+V+ezesMqqorEg38BC
NUHNmhnw4/C0I4gBAQ4x0SJOGnfKGZKR9yzvbkJtvEn732JcEZCbdTZmaxkwlenX
vM+mStcJaxBCB/h5xJ5VOF5nDbTPzLphIpzddr3zx/Jxjna9QB1v/YSKYXn+iuwr
uNUXGCvvxBWaBGKrjOdRTRy9adWOgNmtuYDQJ2YOfG8PtPe06ELKjmr2CfaAGrKK
UroyaGvy3qxAV0PlT+UQ4ADSXWt/zl0o5wIDAQAB
-----END RSA PUBLIC KEY-----
]]></pub_key>
</xml>
將獲取到的
pub_key
保存到文件public.pem
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA6Bl76IwSvBTiibZ+CNRUA6BfahMshZ0WJpHD1GpmvcQjeN6Yrv6c
9eIl6gB4nU3isN7bn+LmoVTpH1gHViaV2YyG/zXj4z4h7r+V+ezesMqqorEg38BC
NUHNmhnw4/C0I4gBAQ4x0SJOGnfKGZKR9yzvbkJtvEn732JcEZCbdTZmaxkwlenX
vM+mStcJaxBCB/h5xJ5VOF5nDbTPzLphIpzddr3zx/Jxjna9QB1v/YSKYXn+iuwr
uNUXGCvvxBWaBGKrjOdRTRy9adWOgNmtuYDQJ2YOfG8PtPe06ELKjmr2CfaAGrKK
UroyaGvy3qxAV0PlT+UQ4ADSXWt/zl0o5wIDAQAB
-----END RSA PUBLIC KEY-----
PKCS#1格式的公鑰轉(zhuǎn)成PKCS#8格式的公鑰
IJPay中的接口
- 企業(yè)付款到銀行卡
- 查詢企業(yè)付款到銀行卡
- 獲取RSA加密公鑰
/**
* 企業(yè)付款到銀行
* @param params
* 請求參數(shù)
* @param certPath
* 證書文件目錄
* @param certPassword
* 證書密碼
* @return {String}
*/
public static String payBank(Map<String, String> params, String certPath, String certPassword) {
return WxPayApi.doPostSSL(PAY_BANK_URL, params, certPath, certPassword);
}
/**
* 查詢企業(yè)付款到銀行
* @param params
* 請求參數(shù)
* @param certPath
* 證書文件目錄
* @param certPassword
* 證書密碼
* @return {String}
*/
public static String queryBank(Map<String, String> params, String certPath, String certPassword) {
return WxPayApi.doPostSSL(QUERY_BANK_URL, params, certPath, certPassword);
}
/**
* 獲取RSA加密公鑰
* @param params
* 請求參數(shù)
* @param certPath
* 證書文件目錄
* @param certPassword
* 證書密碼
* @return {String}
*/
public static String getPublicKey(Map<String, String> params, String certPath, String certPassword) {
return WxPayApi.doPostSSL(GETPUBLICKEY_URL, params, certPath, certPassword);
}
示例代碼
/**
* 獲取RSA加密公鑰
* 接口默認輸出PKCS#1格式的公鑰泳炉,商戶需根據(jù)自己開發(fā)的語言選擇公鑰格式
* Java RSA加密需要使用PKCS#8 不然會出現(xiàn)異常algid parse error, not a sequence?
* PKCS#1 轉(zhuǎn) PKCS#8:
* openssl rsa -RSAPublicKey_in -in <filename> -pubout
*/
public void getPublicKey(){
try {
Map<String, String> params = new HashMap<String, String>();
params.put("mch_id", mch_id);
params.put("nonce_str", String.valueOf(System.currentTimeMillis()));
params.put("sign_type", "MD5");
String createSign = PaymentKit.createSign(params, partnerKey);
params.put("sign", createSign);
String publicKeyStr = WxPayApi.getPublicKey(params , certPath, mch_id);
renderText(publicKeyStr);
} catch (Exception e) {
e.printStackTrace();
renderText(e.getMessage());
}
}
/**
* 企業(yè)付款到銀行卡
*/
public void payBank() {
try {
//假設獲取到的RSA加密公鑰為PUBLIC_KEY(PKCS#8格式)
final String PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Bl76IwSvBTiibZ+CNRUA6BfahMshZ0WJpHD1GpmvcQjeN6Yrv6c9eIl6gB4nU3isN7bn+LmoVTpH1gHViaV2YyG/zXj4z4h7r+V+ezesMqqorEg38BCNUHNmhnw4/C0I4gBAQ4x0SJOGnfKGZKR9yzvbkJtvEn732JcEZCbdTZmaxkwlenXvM+mStcJaxBCB/h5xJ5VOF5nDbTPzLphIpzddr3zx/Jxjna9QB1v/YSKYXn+iuwruNUXGCvvxBWaBGKrjOdRTRy9adWOgNmtuYDQJ2YOfG8PtPe06ELKjmr2CfaAGrKKUroyaGvy3qxAV0PlT+UQ4ADSXWt/zl0o5wIDAQAB";
Map<String, String> params = new HashMap<String, String>();
params.put("mch_id", mch_id);
params.put("partner_trade_no", System.currentTimeMillis()+"");
params.put("nonce_str", System.currentTimeMillis()+"");
params.put("enc_bank_no", RSAUtils.encryptByPublicKeyByWx("6214837805417833", PUBLIC_KEY));//收款方銀行卡號
params.put("enc_true_name", RSAUtils.encryptByPublicKeyByWx("周業(yè)文", PUBLIC_KEY));//收款方用戶名
params.put("bank_code", "1001");//收款方開戶行
params.put("amount", "1");
params.put("desc", "IJPay 測試付款到銀行卡-By Javen");
params.put("sign", PaymentKit.createSign(params, partnerKey));
String payBank = WxPayApi.payBank(params , certPath, mch_id);
renderText(payBank);
} catch (Exception e) {
e.printStackTrace();
renderText(e.getMessage());
}
}
/**
* 查詢企業(yè)付款到銀行
*/
public void queryBank() {
try {
String partner_trade_no = getPara("partner_trade_no");
Map<String, String> params = new HashMap<String, String>();
params.put("mch_id", mch_id);
params.put("partner_trade_no", partner_trade_no);
params.put("nonce_str", System.currentTimeMillis()+"");
params.put("sign", PaymentKit.createSign(params, partnerKey));
String queryBank = WxPayApi.queryBank(params, certPath, mch_id);
renderText(queryBank);
} catch (Exception e) {
e.printStackTrace();
renderText(e.getMessage());
}
}
IJPay 讓支付觸手可及接入文檔
如有疑問歡迎留言交流討論