取現-斗拱平臺
專用API
【更新時間: 2024.01.22】
商戶主動發起將收款資金取現到綁定的銀行卡;
商戶開通結算的前提:渠道商端已開通取現相關權限,渠道商端權限開通僅支持在運營控臺開通
取現配置:支持配置D0(取現當日到賬)、D1(取現次日到賬)、T1(取現次工作日到賬)
咨詢
去服務商官網采購>
|
瀏覽次數
41
采購人數
1
試用次數
0
收藏
×
完成
取消
×
書簽名稱
確定
|
- API詳情
- 使用指南
- 常見 FAQ
- 關于我們
- 相關推薦


什么是斗拱平臺的取現?
斗拱開放平臺的取現服務是為商戶和服務商提供的一項資金流轉服務,允許商戶主動發起操作,將收款資金從商戶賬戶轉移到綁定的銀行卡中。這項服務支持多種取現配置,包括D0(當日到賬)、D1(次日到賬)和T1(次工作日到賬),以滿足不同商戶對資金流動性的需求。商戶開通結算的前提是渠道商端已開通取現相關權限,且權限開通僅支持在運營控臺開通。取現服務不僅提高了資金的流轉效率,還為商戶提供了靈活的資金管理方式。
什么是斗拱平臺的取現接口?
斗拱平臺的取現有哪些核心功能?
1. 多模式取現配置:取現服務支持D0、D1和T1三種取現模式,商戶可以根據自身的業務需求和資金流轉需求,選擇合適的到賬時間,實現資金的快速流轉或計劃性管理。
2. 靈活的資金管理:商戶可以通過取現服務,靈活管理自己的資金流,無論是日常經營的資金需求,還是應對突發事件的資金調配,都能得到有效的支持。
3. 安全的交易保障:取現服務提供了嚴格的安全措施,包括密鑰獲取和公共參數獲取等,確保每一筆取現交易的安全性和可靠性。
4. 詳細的交易記錄:商戶可以通過取現服務查詢每一筆取現交易的詳細記錄,包括取現金額、到賬時間等,幫助商戶進行財務核算和資金流分析。
5. 便捷的操作流程:取現服務的操作流程簡潔明了,商戶可以在商戶控臺輕松完成取現操作,無需復雜的步驟,提高了操作的便捷性。
6. 實時的技術支持:服務商控臺提供了取現配置操作指引,商戶在遇到問題時可以快速獲得技術支持,確保取現服務的順暢進行。
斗拱平臺的取現的核心優勢是什么?
1. 提高資金流動性:取現服務使得商戶能夠根據需要快速將資金從商戶賬戶轉移到銀行卡,極大地提高了資金的流動性和使用效率。
2. 靈活的到賬時間選擇:商戶可以根據自己的業務需求選擇當日到賬、次日到賬或次工作日到賬,這種靈活性使得資金管理更加貼合商戶的實際運營情況。
3. 增強資金安全性:通過嚴格的安全措施和密鑰管理,取現服務確保了資金轉移的安全性,降低了資金流轉過程中的風險。
4. 優化財務核算:詳細的交易記錄和查詢功能使得商戶能夠輕松進行財務核算,提高了財務管理的效率和準確性。
5. 提升操作便捷性:簡潔的操作流程和商戶控臺的便捷性使得商戶可以快速完成取現操作,無需復雜的步驟,節省了商戶的時間和人力資源。
6. 強大的技術支持:服務商控臺提供的詳細操作指引和技術支持,使得商戶在遇到問題時能夠得到及時的幫助,確保了取現服務的順利進行。
斗拱平臺的取現有哪些使用限制?
1. 取現業務類型:支持D0、D1和T1部分及全部勾選。
2. 取現手續費配置:配置D0、D1、T1取現手續費及取現手續費率。
3. 取現手續費扣款方式:開通時配置取現手續費只支持統一選擇內扣或外扣,變更時,支持單個取現類型分別設置內扣或外扣。
4. 取現手續費計算:取現手續費=手續費固定金額+取現費率%*取現金額。
5. 接口取現目前僅支持基本戶提現。
在哪些場景會用到斗拱平臺的取現?
1. 商戶日常資金流轉
在日常經營活動中,商戶經常需要將通過各種支付渠道收取的資金匯總并轉入指定的銀行卡,以用于支付貨款、發放工資、支付租金等日常運營開支。斗拱開放平臺的取現服務提供了靈活的到賬時間選擇,商戶可以根據自己的資金需求,選擇當日到賬、次日到賬或次工作日到賬,確保資金能夠及時到位。便捷的操作流程使得商戶在忙碌的經營中也能快速完成資金的轉移,大大提高了資金流轉的效率。一家零售連鎖店在每天營業結束后,需要將當天的收入匯總并轉入公司賬戶,以便第二天支付供應商貨款,取現服務的高效性確保了資金的及時流轉,支持了企業的日常運營。
2. 應急資金調配
在商業運營中,商戶可能會遇到突發事件,如供應鏈中斷、緊急設備維修或市場機會出現等,這些情況都可能需要商戶迅速調配資金以應對。取現服務的即時性和靈活性使得商戶可以在最短時間內將資金轉移到需要的地方。一家工廠突然接到一個大訂單,需要立即購買額外的原材料,通過取現服務,工廠可以將資金快速轉移到供應商賬戶,確保訂單能夠及時完成,抓住市場機會。
3. 財務核算和資金流分析
商戶需要定期進行財務核算和資金流分析,以評估業務表現和優化資金管理。斗拱開放平臺的取現服務提供了詳細的交易記錄查詢功能,商戶可以輕松獲取每一筆取現交易的詳細信息,包括交易時間、金額和到賬時間等。這些數據對于財務團隊來說至關重要,它們可以用來核對賬目、分析現金流趨勢和預測未來的資金需求。一家電子商務公司在每個季度末需要進行財務審計,通過取現服務提供的詳細記錄,財務團隊可以準確地追蹤資金流向,確保財務報告的準確性。
4. 資金規劃和管理
對于需要進行長期資金規劃的商戶來說,選擇合適的取現模式是實現資金計劃性管理的關鍵。斗拱開放平臺的取現服務允許商戶根據業務周期和資金需求,選擇最合適的取現時間,從而更好地規劃資金使用。一家酒店可能在旅游旺季需要更多的流動資金來應對客流量的增加,通過選擇D0或D1取現模式,酒店可以確保在需要時有足夠的現金儲備,以支持日常運營和應對突發事件。
5. 提高資金使用效率
資金使用效率的提升對于任何企業來說都是至關重要的。斗拱開放平臺的取現服務通過提供快速的資金轉移,幫助商戶減少了資金在途時間,加快了資金周轉。這意味著商戶可以更快地回收資金,并將這些資金重新投入到業務中,以產生更多的收入。一家批發商在完成銷售后,需要快速將資金回籠以支付給供應商和補充庫存,取現服務的高效率使得資金能夠迅速回流,支持了業務的連續性。
6. 增強資金安全性
在資金流轉過程中,安全性是商戶最為關心的問題之一。斗拱開放平臺的取現服務提供了嚴格的安全措施,包括密鑰管理和交易加密,確保了資金轉移的安全性。這降低了資金在流轉過程中的風險,保護了商戶的資金安全。一家在線支付服務提供商需要處理大量的客戶交易,通過使用取現服務,公司可以確保每一筆交易都是安全的,從而保護了公司和客戶的資金不受網絡攻擊和欺詐行為的影響。


v2版接口加簽驗簽
最近更新時間:2024.9.1
適用范圍
所有以下出口接口: https://api.huifu.com/v2/
公私鑰
查看聯調公私參數獲取說明;
參數形式
- 接口都是以POST方法請求一個完整的JSON對象(不是JSON字符串)
- body.data 是完整的業務參數
- body.data是JSON對象,不是JSON字符串
- body.data內層復雜對象類型請參考API文檔(大部分是字符串類型)
- 詳細樣例,請參考具體文檔或者下面的例子
- body.data提出了完整的業務參數,第一層是基本類型(String、Int),沒有復雜類型JSON
- body.data第一層所有提交的參數參與簽名
如果出現樓層,則以JSON字符串形式傳遞。例如下面的terminal_device_info
{
"sys_id":"test",
"product_id":"HSK",
“data”: {
"devs_id": "TYXJL0623715525894234",
"auth_code": "134558771750600000",
"terminal_device_info": "{\"devs_id\":\"TYXJL0623715525894234\"}"
},
“sign”:”簽名”
}復制代碼復制失敗復制成功
如何加簽
只需對body.data中的內容進行加簽。
- body.data中的數據,去掉換行、空格等格式字符后,按照參數字典順序排序生成字符串(參數名ASCII碼到大排序(字典序);參數名區分大小寫;)以上文為排序后
{
"auth_code": "134558771750600000",
"devs_id": "TYXJL0623715525894234",
"terminal_device_info": "{\"devs_id\":\"TYXJL0623715525894234\"}"
}復制代碼復制失敗復制成功
注:如果是JSON字符串,不需要進行排序,例如terminal_device_info的值不需要排序
- 對第一步生成的字符串結合您的私鑰進行加簽;注:如果你有自己的私鑰可以用自己的。如果沒有看到聯調公私鑰參數獲取后續說明
- 首先將json對象按照參數字典順序(參數名ASCII碼到大排序,參數名區分大小寫)排序生成字符串,然后進行加簽和驗簽。
JSON數據排序代碼示例
java代碼示例
import java.util.TreeMap;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
JSON.toJSONString(JSONObject.parseObject(inputDataJSON, TreeMap.class))復制代碼復制失敗復制成功
python代碼示例
# json 數據排序示例
def sort_dict(params):
"""
排序json 對象,按ASCII順序排序。多層結構只排序第一層
:param params:
:return:
"""
keys = sorted(params.keys())
result = {}
for key in keys:
value = params.get(key)
if type(value).__name__ == 'dict':
result[key] = value
elif type(value).__name__ == 'list' and len(value) != 0:
result[key] = params.get(key)
elif params.get(key) is not None:
result[key] = params.get(key)
return result復制代碼復制失敗復制成功
PHP代碼示例
/** @param array $data 原數據( 排序后的json字符串; 數組參數排序后轉json字符串(數據的中文和斜杠均不轉碼):**/
ksort($post_data);
json_encode($post_data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE); )復制代碼復制失敗復制成功
C#代碼示例
//排序
public static string sort4JsonString(string sourceJson)
{
var dic = JsonConvert.DeserializeObject<SortedDictionary<string, object>>(sourceJson);
SortedDictionary<string, object> keyValues = new SortedDictionary<string, object>(dic);
var result = keyValues.OrderBy(m => m.Key);//升序 把Key換成Value 就是對Value進行排序
//var result = keyValues.OrderByDescending(m => m.Key);//降序
//簡化為如下代碼
Dictionary<string, object> resultDic = result.ToDictionary(x => x.Key, x => x.Value);
return JsonConvert.SerializeObject(resultDic);
}復制代碼復制失敗復制成功
- 概要如下
java代碼示例
/**
* RSA私鑰簽名:簽名方式SHA256WithRSA
* @param data 待簽名字符串
* @param privateKeyBase64 私鑰(Base64編碼)
* @return 簽名byte[]
* @throws Exception
*/
public static String sign(String data, String privateKeyBase64) {
// Base64 --> Key
try {
byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// Sign
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(signature.sign());
} catch (Exception e) {
return null;
}
}復制代碼復制失敗復制成功
python代碼示例
# 私鑰加簽
def rsa_sign(private_key, message, charset='utf-8'):
try:
private_key = add_start_end(private_key, "-----BEGIN PRIVATE KEY-----\n", "\n-----END PRIVATE KEY-----")
msg = message.encode(charset)
private_key = RSA.importKey(private_key)
# message做“哈希”處理,RSA簽名這么要求的
hash_obj = SHA256.new(msg)
signature = pkcs1_15.new(private_key).sign(hash_obj)
return True, base64.b64encode(signature).decode(charset)
except Exception as ex:
return False, str(ex)復制代碼復制失敗復制成功
PHP代碼示例
/**
* 私鑰加簽(對數據源排序),可用于 V2 版本接口數據加簽
*
* @param array $data 原數據( 排序后的json字符串; 數組參數排序后轉json字符串(數據的中文和斜杠均不轉碼):
ksort($post_data); json_encode($post_data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE); )
*
* @param string $rsaPrivateKey 私鑰
* @param int $alg 默認 OPENSSL_ALGO_SHA256
*
* @return string 簽名串
*/
function sha_with_rsa_sign($data, $rsaPrivateKey, $alg=OPENSSL_ALGO_SHA256){
$key = "-----BEGIN PRIVATE KEY-----\n".wordwrap($rsaPrivateKey, 64, "\n", true)."\n-----END PRIVATE KEY-----";
$signature= '';
try {
openssl_sign($data, $signature, $key, $alg);
} catch (\Exception $e) {
echo $e->getMessage();
}
return base64_encode($signature);
}復制代碼復制失敗復制成功
C#代碼示例
//私鑰加簽
public static string sign(string signaturePrivateKey, string signatureData, string hashAlgorithm = "SHA256", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// var privateJavaKey = signaturePrivateKey;
// var privateCSharpKey = RSAPrivateKeyJava2DotNet(privateJavaKey);
// rsa.FromXmlString(privateCSharpKey);
rsa.FromPrivateKeyJavaString(signaturePrivateKey);
byte[] signatureBytes = rsa.SignData(Encoding.GetEncoding(encoding).GetBytes(signatureData), hashAlgorithm);
return Convert.ToBase64String(signatureBytes);
}復制代碼復制失敗復制成功
提示:您可以通過斗拱CLI工具提供的verify_sign命令驗證生成的簽文是否正確;參見CLI工具介紹
如何簽
僅對數據中的內容進行驗簽
- 數據中的數據,同步返參參數字典順序排序生成字符串,自動返參不需要排序。
以上文為例整理后
{
"auth_code": "134558771750600000",
"devs_id": "TYXJL0623715525894234",
"terminal_device_info": "{\"devs_id\":\"TYXJL0623715525894234\"}"
}復制代碼復制失敗復制成功
注:如果是JSON字符串,不需要進行排序,例如terminal_device_info不需要排序;
- 對第一步生成的字符串結合斗拱平臺進行驗簽
- 經驗訂閱如下
java代碼示例
/**
* 使用匯付RSA公鑰驗簽
* @param data 待簽名字符串
* @param publicKeyBase64 公鑰(Base64編碼)
* @return 驗簽結果
* @throws Exception
*/
public static boolean verify(String data, String publicKeyBase64, String sign) {
// Base64 --> Key
try {
byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
// verify
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initVerify(publicKey);
signature.update(data.getBytes("UTF-8"));
return signature.verify(Base64.getDecoder().decode(sign));
} catch (Exception e) {
logger.error("Exception", e);
return false;
}
}復制代碼復制失敗復制成功
python代碼示例
# 使用匯付公鑰驗簽
def rsa_design(signature, message, my_rsa_public):
try:
my_rsa_public = fill_public_key_marker(my_rsa_public)
message = message.encode("utf-8")
public_key = RSA.importKey(my_rsa_public)
# message做“哈希”處理,RSA簽名這么要求的
hash_obj = SHA256.new(message)
pkcs1_15.new(public_key).verify(hash_obj, base64.b64decode(signature))
return True, ''
except (ValueError, TypeError) as ex:
return False, str(ex)復制代碼復制失敗復制成功
PHP代碼示例
/**
* 匯付公鑰驗簽(對數據源排序),可用于 V2 版本接口返回數據驗簽
*
* @param string $signature 簽文
* @param array $data 原數據(array)
* @param string $rsaPublicKey 公鑰
* @param int $alg 默認 OPENSSL_ALGO_SHA256
*
* @return false|int 驗證結果:成功/失敗
*/
function verifySign_sort($signature, $data, $rsaPublicKey, $alg=OPENSSL_ALGO_SHA256){
$key = "-----BEGIN PUBLIC KEY-----\n".wordwrap($rsaPublicKey, 64, "\n", true)."\n-----END PUBLIC KEY-----";
ksort($data);
return openssl_verify(json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE), base64_decode($signature), $key, $alg);
}復制代碼復制失敗復制成功
C#代碼示例
//使用匯付公鑰驗簽
public static bool verfySign(string publicKey, string signature, string content, string hashAlgorithm = "SHA256", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//導入公鑰,準備驗證簽名
rsa.FromPublicKeyJavaString(publicKey);
//返回數據驗證結果
byte[] Data = Encoding.GetEncoding(encoding).GetBytes(content);
byte[] rgbSignature = Convert.FromBase64String(signature);
return rsa.VerifyData(Data, hashAlgorithm, rgbSignature);
}




匯付天下成立于2006年7月,是國內領先的數字化支付企業,旨在為企業收款、數據集成和資金管理提供平臺服務。匯付一路在技術實踐、商業模式、解決方案等領域開創行業先河,在業內率先開啟全方位的數字化轉型,首創支付PaaS“斗拱平臺”,踐行 Payment&Beyond 發展戰略,與各方共建數字生態。
秉持“一切以客戶為中心”的發展宗旨,匯付面向品牌連鎖、集團企業、互聯網平臺、跨境國際、數字經濟、小微商戶等行業場景,攜手數百家知名SaaS/軟件公司、商業銀行以及數十萬渠道服務商等合作伙伴,提供全渠道收款和數據管理、智能對賬、供應鏈資金結算、數電發票、數字權益、跨云IaaS集成等一站式數字化解決方案,助力上萬家行業客戶與千萬中小微商戶實現降本、提效、增長的轉型目標。


v2版接口加簽驗簽
最近更新時間:2024.9.1
適用范圍
所有以下出口接口: https://api.huifu.com/v2/
公私鑰
查看聯調公私參數獲取說明;
參數形式
- 接口都是以POST方法請求一個完整的JSON對象(不是JSON字符串)
- body.data 是完整的業務參數
- body.data是JSON對象,不是JSON字符串
- body.data內層復雜對象類型請參考API文檔(大部分是字符串類型)
- 詳細樣例,請參考具體文檔或者下面的例子
- body.data提出了完整的業務參數,第一層是基本類型(String、Int),沒有復雜類型JSON
- body.data第一層所有提交的參數參與簽名
如果出現樓層,則以JSON字符串形式傳遞。例如下面的terminal_device_info
{
"sys_id":"test",
"product_id":"HSK",
“data”: {
"devs_id": "TYXJL0623715525894234",
"auth_code": "134558771750600000",
"terminal_device_info": "{\"devs_id\":\"TYXJL0623715525894234\"}"
},
“sign”:”簽名”
}復制代碼復制失敗復制成功
如何加簽
只需對body.data中的內容進行加簽。
- body.data中的數據,去掉換行、空格等格式字符后,按照參數字典順序排序生成字符串(參數名ASCII碼到大排序(字典序);參數名區分大小寫;)以上文為排序后
{
"auth_code": "134558771750600000",
"devs_id": "TYXJL0623715525894234",
"terminal_device_info": "{\"devs_id\":\"TYXJL0623715525894234\"}"
}復制代碼復制失敗復制成功
注:如果是JSON字符串,不需要進行排序,例如terminal_device_info的值不需要排序
- 對第一步生成的字符串結合您的私鑰進行加簽;注:如果你有自己的私鑰可以用自己的。如果沒有看到聯調公私鑰參數獲取后續說明
- 首先將json對象按照參數字典順序(參數名ASCII碼到大排序,參數名區分大小寫)排序生成字符串,然后進行加簽和驗簽。
JSON數據排序代碼示例
java代碼示例
import java.util.TreeMap;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
JSON.toJSONString(JSONObject.parseObject(inputDataJSON, TreeMap.class))復制代碼復制失敗復制成功
python代碼示例
# json 數據排序示例
def sort_dict(params):
"""
排序json 對象,按ASCII順序排序。多層結構只排序第一層
:param params:
:return:
"""
keys = sorted(params.keys())
result = {}
for key in keys:
value = params.get(key)
if type(value).__name__ == 'dict':
result[key] = value
elif type(value).__name__ == 'list' and len(value) != 0:
result[key] = params.get(key)
elif params.get(key) is not None:
result[key] = params.get(key)
return result復制代碼復制失敗復制成功
PHP代碼示例
/** @param array $data 原數據( 排序后的json字符串; 數組參數排序后轉json字符串(數據的中文和斜杠均不轉碼):**/
ksort($post_data);
json_encode($post_data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE); )復制代碼復制失敗復制成功
C#代碼示例
//排序
public static string sort4JsonString(string sourceJson)
{
var dic = JsonConvert.DeserializeObject<SortedDictionary<string, object>>(sourceJson);
SortedDictionary<string, object> keyValues = new SortedDictionary<string, object>(dic);
var result = keyValues.OrderBy(m => m.Key);//升序 把Key換成Value 就是對Value進行排序
//var result = keyValues.OrderByDescending(m => m.Key);//降序
//簡化為如下代碼
Dictionary<string, object> resultDic = result.ToDictionary(x => x.Key, x => x.Value);
return JsonConvert.SerializeObject(resultDic);
}復制代碼復制失敗復制成功
- 概要如下
java代碼示例
/**
* RSA私鑰簽名:簽名方式SHA256WithRSA
* @param data 待簽名字符串
* @param privateKeyBase64 私鑰(Base64編碼)
* @return 簽名byte[]
* @throws Exception
*/
public static String sign(String data, String privateKeyBase64) {
// Base64 --> Key
try {
byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// Sign
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(signature.sign());
} catch (Exception e) {
return null;
}
}復制代碼復制失敗復制成功
python代碼示例
# 私鑰加簽
def rsa_sign(private_key, message, charset='utf-8'):
try:
private_key = add_start_end(private_key, "-----BEGIN PRIVATE KEY-----\n", "\n-----END PRIVATE KEY-----")
msg = message.encode(charset)
private_key = RSA.importKey(private_key)
# message做“哈希”處理,RSA簽名這么要求的
hash_obj = SHA256.new(msg)
signature = pkcs1_15.new(private_key).sign(hash_obj)
return True, base64.b64encode(signature).decode(charset)
except Exception as ex:
return False, str(ex)復制代碼復制失敗復制成功
PHP代碼示例
/**
* 私鑰加簽(對數據源排序),可用于 V2 版本接口數據加簽
*
* @param array $data 原數據( 排序后的json字符串; 數組參數排序后轉json字符串(數據的中文和斜杠均不轉碼):
ksort($post_data); json_encode($post_data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE); )
*
* @param string $rsaPrivateKey 私鑰
* @param int $alg 默認 OPENSSL_ALGO_SHA256
*
* @return string 簽名串
*/
function sha_with_rsa_sign($data, $rsaPrivateKey, $alg=OPENSSL_ALGO_SHA256){
$key = "-----BEGIN PRIVATE KEY-----\n".wordwrap($rsaPrivateKey, 64, "\n", true)."\n-----END PRIVATE KEY-----";
$signature= '';
try {
openssl_sign($data, $signature, $key, $alg);
} catch (\Exception $e) {
echo $e->getMessage();
}
return base64_encode($signature);
}復制代碼復制失敗復制成功
C#代碼示例
//私鑰加簽
public static string sign(string signaturePrivateKey, string signatureData, string hashAlgorithm = "SHA256", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// var privateJavaKey = signaturePrivateKey;
// var privateCSharpKey = RSAPrivateKeyJava2DotNet(privateJavaKey);
// rsa.FromXmlString(privateCSharpKey);
rsa.FromPrivateKeyJavaString(signaturePrivateKey);
byte[] signatureBytes = rsa.SignData(Encoding.GetEncoding(encoding).GetBytes(signatureData), hashAlgorithm);
return Convert.ToBase64String(signatureBytes);
}復制代碼復制失敗復制成功
提示:您可以通過斗拱CLI工具提供的verify_sign命令驗證生成的簽文是否正確;參見CLI工具介紹
如何簽
僅對數據中的內容進行驗簽
- 數據中的數據,同步返參參數字典順序排序生成字符串,自動返參不需要排序。
以上文為例整理后
{
"auth_code": "134558771750600000",
"devs_id": "TYXJL0623715525894234",
"terminal_device_info": "{\"devs_id\":\"TYXJL0623715525894234\"}"
}復制代碼復制失敗復制成功
注:如果是JSON字符串,不需要進行排序,例如terminal_device_info不需要排序;
- 對第一步生成的字符串結合斗拱平臺進行驗簽
- 經驗訂閱如下
java代碼示例
/**
* 使用匯付RSA公鑰驗簽
* @param data 待簽名字符串
* @param publicKeyBase64 公鑰(Base64編碼)
* @return 驗簽結果
* @throws Exception
*/
public static boolean verify(String data, String publicKeyBase64, String sign) {
// Base64 --> Key
try {
byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
// verify
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initVerify(publicKey);
signature.update(data.getBytes("UTF-8"));
return signature.verify(Base64.getDecoder().decode(sign));
} catch (Exception e) {
logger.error("Exception", e);
return false;
}
}復制代碼復制失敗復制成功
python代碼示例
# 使用匯付公鑰驗簽
def rsa_design(signature, message, my_rsa_public):
try:
my_rsa_public = fill_public_key_marker(my_rsa_public)
message = message.encode("utf-8")
public_key = RSA.importKey(my_rsa_public)
# message做“哈希”處理,RSA簽名這么要求的
hash_obj = SHA256.new(message)
pkcs1_15.new(public_key).verify(hash_obj, base64.b64decode(signature))
return True, ''
except (ValueError, TypeError) as ex:
return False, str(ex)復制代碼復制失敗復制成功
PHP代碼示例
/**
* 匯付公鑰驗簽(對數據源排序),可用于 V2 版本接口返回數據驗簽
*
* @param string $signature 簽文
* @param array $data 原數據(array)
* @param string $rsaPublicKey 公鑰
* @param int $alg 默認 OPENSSL_ALGO_SHA256
*
* @return false|int 驗證結果:成功/失敗
*/
function verifySign_sort($signature, $data, $rsaPublicKey, $alg=OPENSSL_ALGO_SHA256){
$key = "-----BEGIN PUBLIC KEY-----\n".wordwrap($rsaPublicKey, 64, "\n", true)."\n-----END PUBLIC KEY-----";
ksort($data);
return openssl_verify(json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE), base64_decode($signature), $key, $alg);
}復制代碼復制失敗復制成功
C#代碼示例
//使用匯付公鑰驗簽
public static bool verfySign(string publicKey, string signature, string content, string hashAlgorithm = "SHA256", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//導入公鑰,準備驗證簽名
rsa.FromPublicKeyJavaString(publicKey);
//返回數據驗證結果
byte[] Data = Encoding.GetEncoding(encoding).GetBytes(content);
byte[] rgbSignature = Convert.FromBase64String(signature);
return rsa.VerifyData(Data, hashAlgorithm, rgbSignature);
}






匯付天下成立于2006年7月,是國內領先的數字化支付企業,旨在為企業收款、數據集成和資金管理提供平臺服務。匯付一路在技術實踐、商業模式、解決方案等領域開創行業先河,在業內率先開啟全方位的數字化轉型,首創支付PaaS“斗拱平臺”,踐行 Payment&Beyond 發展戰略,與各方共建數字生態。
秉持“一切以客戶為中心”的發展宗旨,匯付面向品牌連鎖、集團企業、互聯網平臺、跨境國際、數字經濟、小微商戶等行業場景,攜手數百家知名SaaS/軟件公司、商業銀行以及數十萬渠道服務商等合作伙伴,提供全渠道收款和數據管理、智能對賬、供應鏈資金結算、數電發票、數字權益、跨云IaaS集成等一站式數字化解決方案,助力上萬家行業客戶與千萬中小微商戶實現降本、提效、增長的轉型目標。

