用户结算账户

接入 Ping++ 用户结算账户接口,仅需要 Ping++ Server SDK 即可。服务器端需要做的就是向 Ping++ 请求创建 Settle Account 对象,具体步骤如下:

  1. 设置 API-Key
  2. SDK 验证签名设置
  3. 从服务端发起创建用户结算账户请求,获取 Settle Account 对象

第一步:设置 API-Key

Ping++ API 交易时需要设置 API-Key,Server SDK 提供了设置的方法。如果你直接使用 API ,需要在 header 中加入 Authorization,格式是 Authorization: Bearer API-Key。

\Pingpp\Pingpp::setApiKey('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');
Pingpp.apiKey = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC";
var pingpp = require('pingpp')('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');
pingpp.api_key = 'sk_test_ibbTe5jLGCi5rzfH4OqPW9KC'
Pingpp.api_key = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC"
pingpp.Key = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC"
Pingpp.Pingpp.SetApiKey("sk_test_ibbTe5jLGCi5rzfH4OqPW9KC");

第二步:SDK 验证签名设置

为了进一步增强交易请求的安全性,Ping++ 交易接口针对所有的 POST 和 PUT 请求已经新增 RSA 加密验签功能。如果使用该签名验证功能,你需要生成密钥,然后将私钥配置到你的代码中,公钥上传至 Ping++ 管理平台并启用验签开关。首先你需要本地生成 RSA 公钥和私钥,生成方法请参考:如何获取 RSA 公钥和私钥?

设置请求签名密钥

你需要在代码中设置请求签名的私钥(rsa_private_key.pem),可以读取配置私钥文件的路径或者直接定义变量。你如果通过 API 接口校验的话,需要生成 RSA 签名(SHA256)并在请求头中添加 Pingplusplus-Signature,如果使用 SDK 的话只需要配置私钥即可。

\Pingpp\Pingpp::setPrivateKeyPath(__DIR__ . '/your_rsa_private_key.pem');
Pingpp.privateKeyPath = "/path/to/your_rsa_private_key.pem";
pingpp.setPrivateKeyPath(__dirname + "/your_rsa_private_key.pem");
pingpp.private_key_path = 'your_rsa_private_key.pem'
Pingpp.private_key_path = File.dirname(__FILE__) + '/your_rsa_private_key.pem'
privateKey, err := ioutil.ReadFile("your_rsa_private_key.pem")
Pingpp.Pingpp.SetPrivateKeyPath(@"../../your_rsa_private_key.pem");

上传公钥至 Ping++ 管理平台

设置完代码中的私钥,你需要将已经生成的公钥(rsa_public_key.pem)填写到 Ping++ 管理平台上。 配置路径: 登录 Ping++ 管理平台->点击右上角公司名称->企业面板->开发参数->商户 RSA 公钥->将你的公钥复制粘贴进去并且保存->先启用 Test 模式进行测试->测试通过后启用 Live 模式

rsa_keys_setting

注意: 一旦上传公钥至 Ping++ 管理平台并启用 Live 模式,则验证签名功能即时生效,Ping++ 会立即验证你的真实线上交易验签请求。如果私钥为空或错误,则会交易失败,所以请确保测试模式正常后再启用 Live 开关。

第三步:从服务端发起创建用户结算账户请求,获取 Settle Account 对象

调用 Ping++ Server SDK 发起创建请求,发起请求所需参数具体可参考 API 文档

//结算账户渠道。alipay, wx_pub/wx, bank_account
$channel = 'alipay';
//创建结算账户
$recipient = require dirname(__FILE__) . '/recipient/' . $channel . '.php';
$settle_account = \Pingpp\SettleAccount::create('user_001', [
'channel' => $channel,
'recipient' => $recipient
]);
echo $settle_account;
String userId = "test_user_001";
Map < String, Object > params = new HashMap < String, Object > ();
params.put("channel", "alipay"); // [wx_pub, wx, alipay, bank_account] 其中一种
Map < String, Object > recipient = new HashMap < String, Object > (); // recipient 参数请参考各个渠道,以下是 alipay 参数
recipient.put("account", "13000000001"); // 接收者支付宝账号
recipient.put("name", "USER NAME"); // 接收者姓名
recipient.put("type", "b2c"); // 转账类型
recipient.put("account_type", "ALIPAY_LOGONID"); // 收款方账户类型
params.put("recipient", recipient);
SettleAccount obj = SettleAccount.create(userId, params);
pingpp.settleAccounts.create(
APP_ID, 'test_user_001', // User ID
{
'channel': 'alipay',
// [wx_pub, wx, alipay, bank_account] 其中一种
'recipient': { // recipient 参数请参考各个渠道,以下是 alipay 参数
'account': 'account01@gmail.com',
// 接收者支付宝账号
'name': '李四',
// 接收者姓名
'type': 'b2c',
// 转账类型
'account_type': 'ALIPAY_LOGONID'
}
}, function(err, data) {
// YOUR CODE
if (err != null) {
console.log(err);
}
});
params = {
"channel": "bank_account",
"recipient": {
"account": "6214850266666666",
"name": "张三",
"type": "b2c",
#转账类型。b2c:企业向个人付款,b2b:企业向企业付款。"open_bank": "招商银行",
"open_bank_code": "0308"
}
}
settle_account = pingpp.SettleAccount.create(app = pingpp.app_id, user = 'test_user_004', * * params)
print('create settle_account - unionpay:', settle_account) #创建结算账号 - 支付宝渠道
params = {
"channel": "alipay",
"recipient": {
"account": "account@domain.com",
"name": "李四",
"type": "b2c"
#转账类型。b2c:企业向个人付款。
}
}
settle_account = pingpp.SettleAccount.create(app = pingpp.app_id, user = 'test_user_004', * * params)
print('create settle_account -alipay:', settle_account) #创建结算账号 - 微信渠道
params = {
"channel": "wx_pub",
"recipient": {
"account": "your_open_id",
"name": "王五",
"type": "b2c",
#转账类型。b2c:企业向个人付款。"force_check": False
}
}
settle_account = pingpp.SettleAccount.create(app = pingpp.app_id, user = 'test_user_004', * * params)
params = {: channel = > 'wx_pub',
: recipient = > {: account = > 'oazpsj-ejmwkkskuggaj2h2kaz8ah'
}
}
u = Pingpp::SettleAccount.create(params, {: user = > get_user_id
})
func (c *SettleAccountDemo) New() (*pingpp.SettleAccount, error) {
//目前支持的渠道有 bank_account,alipay,wx_pub
params := &pingpp.SettleAccountParams{
Channel: "bank_account",
Recipient: map[string]interface{}{
"account": "6214666666666666",
"name": "张三",
"type": "b2c", //转账类型。b2c:企业向个人付款,b2b:企业向企业付款。
"open_bank": "招商银行",
"open_bank_code": "0308",
},
}
return settleAccount.New("app_1Gqj58ynP0mHeX1q", "test_user_003", params)
}
var paramBankAccount = new Dictionary<string, object> {
{"channel","bank_account"},
{"recipient", new Dictionary<string,object>{
{"account", "6214666666666666"}, //接收者银行卡账号。
{"name", "张三"}, //接收者姓名。
{"type", "b2c"}, //转账类型。b2c:企业向个人付款,b2b:企业向企业付款。
{"open_bank", "招商银行"}, //开户银行。
{"open_bank_code", "0308"}, //业务代码,根据通联业务人员提供,不填使用通联提供默认值 09900。
{"business_code","09900"}, //业务代码,根据通联业务人员提供,不填使用通联提供默认值 09900。
{"card_type", 0}, //银行卡号类型,0:银行卡;1:存折。
{"prov", "上海市"}, //开户银行所在省份。
{"city", "上海市"}, //开户银行所在城市。
{"term_type", "07"}, //代付业务使用场景, 07: 互联网, 08: 移动端。
{"sub_bank", "陆家嘴支行"} //开户支行名称。
}}
};
Console.WriteLine("**** 创建 settle_account-bank_account 渠道 对象 ****");
Console.WriteLine(SettleAccount.Create(appId, "test_user_002", paramBankAccount));
Console.WriteLine();
var paramAlipay = new Dictionary<string, object> {
{"channel","alipay"},
{"recipient", new Dictionary<string,object>{
{"account", "13166666666"},
{"name", "接收者姓名"},
{"type", "b2c"},
}}
};
Console.WriteLine("**** 创建 settle_account 对象-alipay渠道 ****");
Console.WriteLine(SettleAccount.Create(appId, "test_user_002", paramAlipay));
Console.WriteLine();
var paramWxpub = new Dictionary<string, object> {
{"channel","wx_pub"},
{"recipient", new Dictionary<string,object>{
{"account", "接收者open_id"},
{"name", "王五"}, //收款人姓名。当该参数为空,则不校验收款人姓名。
{"type", "b2c"}, //转账类型。b2c:企业向个人付款,b2b:企业向企业付款。
{"force_check", false}, //是否强制校验收款人姓名。仅当 name 参数不为空时该参数生效。
}}
};
Console.WriteLine("**** 创建 settle_account 对象-wx_pub渠道 ****");
Console.WriteLine(SettleAccount.Create(appId, "test_user_002", paramWxpub));

Ping++ 收到创建用户结算账户请求后返回给你的服务器一个 Settle Account 对象,下面是 Settle Account 对象的一个示例:

{
"id": "320217022818035400000601",
"object": "settle_account",
"created": 1488276234,
"livemode": true,
"channel": "alipay",
"recipient": {
"account": "a***@gmail.com",
"name": "***哥",
"type": "b2c"
}
}

用户结算账户查询

Ping++ 提供接口可以通过用户 ID 查询对应的用户结算账户对象及该用户绑定的所有结算账户。

单个用户结算账户查询

$uid = 'test_user_003';
$id = '320217022818035400000601';
try {
$settle_account = \Pingpp\SettleAccount::retrieve($uid,$id);
echo $settle_account;
} catch (\Pingpp\Error\Base $e) {
if ($e->getHttpStatus() != null) {
header('Status: ' . $e->getHttpStatus());
echo $e->getHttpBody();
} else {
echo $e->getMessage();
}
}
exit;
String userId = "test_user_001";
String settleAccountId = "320117082311291100001002"; // 结算账户对象 ID
SettleAccount obj = SettleAccount.retrieve(userId, settleAccountId);
pingpp.settleAccounts.retrieve(
APP_ID,
'1477034484747', // User ID
'320117061416423600014001', // settle_account ID
function(err, data) {
// YOUR CODE
if (err != null){
console.log(err);
}
}
);
settle_account = pingpp.SettleAccount.retrieve(app = pingpp.app_id, user = 'test_user_004', settle_account_id = '320117082519305500005901')
Pingpp::SettleAccount.retrieve('320217041815593200000501', {:user => get_user_id})
func (c *SettleAccountDemo) Get() (*pingpp.SettleAccount, error) {
return settleAccount.Get("app_1Gqj58ynP0mHeX1q", "user_004", "320217031816231000001001")
}
SettleAccount.Retrieve(appId, "test_user_002", "320217032111554400000901")

用户列表查询

$settle_account = \Pingpp\SettleAccount::all('user_004');
echo $settle_account;
String userId = "test_user_001";
Map<String, Object> params = new HashMap<>();
params.put("page", 1);
params.put("per_page", 3);
SettleAccountCollection obj = SettleAccount.list(userId, params);
pingpp.settleAccounts.list(
APP_ID,
'1477034484747', // User ID
{ page: 1, per_page: 3 },
function(err, data) {
// YOUR CODE
if (err != null){
console.log(err);
}
}
);
settle_account_list = pingpp.SettleAccount.list(app=pingpp.app_id, user='test_user_004')
Pingpp::SettleAccount.list({:per_page => 3}, {:user => get_user_id})
func (c *SettleAccountDemo) List() (*pingpp.SettleAccountList, error) {
params := &pingpp.PagingParams{}
params.Filters.AddFilter("page", "", "1") //取第一页数据
params.Filters.AddFilter("per_page", "", "2") //每页两个SettleAccount对象
return settleAccount.List("app_1Gqj58ynP0mHeX1q", "user_004", params)
}
SettleAccount.List(appId, "test_user_002")

注意事项

目前结算账户类型支持微信、支付宝、银行卡,且每个用户仅支持在不同账户类型下分别配置最多一个账户。

下一步订单