余额明细

当用户的余额账户发生充值、充值退款、提现、收到赠送、支付/收款、退款/收到退款、转账/收到转账、分润/收到分润等行为时,Ping++ 会自动生成 balance_transaction 对象记录用户余额账户变化的明细。

可通过服务器端向 Ping++ 发起查询,请求 Balance Transaction 接口来确认用户余额账户变化的明细,具体步骤如下:

  1. 设置 API-Key
  2. SDK 验证签名设置
  3. 从服务端发起余额明细查询请求

第一步:设置 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 开关。

第三步:从服务端发起余额明细查询请求

可以主动调用 余额明细查询接口 来获得用户余额账户变化的明细。

查询 Balance Transaction 对象

\Pingpp\BalanceTransaction::retrieve($txn_id);
BalanceTransaction obj = BalanceTransaction.retrieve("600170822661998110720001");
pingpp.balanceTransactions.retrieve(
APP_ID,
'310317061416154308155101', // Transaction ID
function(err, data) {
if (err != null){
console.log('pingpp.balanceTransactions.retrieve fail:', err);
}
// YOUR CODE
}
);
retr_bt = pingpp.BalanceTransaction.retrieve(app=app_id, id="600170825551333980160001")
txn = Pingpp::BalanceTransaction.retrieve(get_txn_id)
balanceTransaction.Get(c.demoAppID, c.balanceTransactionId)
BalanceTransaction.Retrieve(appId, "310217032213081700008201");

查询 Balance Transaction 对象列表

$params = ['per_page' => 3];
$bt = \Pingpp\BalanceTransaction::all($params);
Map<String, Object> params = new HashMap<>();
params.put("page", 1);
params.put("per_page", 3);
// 查询 balance_transaction 列表方法
// 参数: params
BalanceTransactionCollection objs = BalanceTransaction.list(params);
pingpp.balanceTransactions.list(
APP_ID,
{ page: 1, per_page: 3 },
function(err, data) {
if (err != null){
console.log('pingpp.balanceTransactions.list fail:', err);
}
// YOUR CODE
}
);
bt_list = pingpp.BalanceTransaction.list(app=app_id)
txns = Pingpp::BalanceTransaction.list({:per_page => 3})
params := &pingpp.PagingParams{}
params.Filters.AddFilter("per_page", "", "2")
balanceTransaction.List(c.demoAppID, params)
var listParams = new Dictionary<string, object>
{
{"page", 1},
{"per_page", 10},
};
var list = BalanceTransaction.List(appId, listParams);

下一步优惠券