用户

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

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

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

第三步:从服务端发起创建用户请求,获取 User 对象

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

$user = \Pingpp\User::create(['id' = > uniqid('uid'), // 用户 ID ,由商户提供
]);
echo $user;
Map < String, Object > params = new HashMap < String, Object > ();
params.put("id", "test_user_" + System.currentTimeMillis()); // 用户 ID,首字母必须是英文数字或者 _-@, 必传
params.put("address", "Shanghai, China"); // 用户地址, 可选
params.put("avatar", "https://example.com/avatar.png"); // 头像, 可选
params.put("email", params.get("id") + "@gmail.com"); // 邮箱地址, 可选
params.put("gender", System.currentTimeMillis() % 2 == 1 ? "MALE" : "FEMALE"); // 性别。MALE:男,FEMALE:女, 可选
params.put("mobile", "17602101010"); // 手机号码, 可选
Map < String, Object > metadata = new HashMap < String, Object > ();
metadata.put("custom_key", "custom_value");
params.put("metadata", metadata);
User obj = User.create(params); //创建 User 方法
pingpp.users.create(APP_ID,{
'id': 'user_' + new Date().getTime().toString(),
'address': null, // 用户地址
'avatar': null, // 头像
'email': null, // 邮箱地址
'gender': 'MALE', // 性别
'metadata': {}, // metadata
'mobile': null, // 手机号码
'name': '123', // 用户昵称
}, function(err, user) {
// YOUR CODE
if (err != null){
console.log('pingpp.users.create fail:', err);
}
});
# id 唯一, 测试需重新生成
request_info = {
"id": "test_user_0010",
"address": "address_1",
"avatar": None,
"email": None,
"gender": "MALE",
"metadata": {},
"mobile": None,
"name": "Your user name"
}
# app_id 支持全局配置
pingpp.app_id = app_id
# 可以变动app_id
try:
# 创建user
user = pingpp.User.create(app=app_id, **request_info)
print(user)
except Exception as e:
print(e.http_body)
user_id = Digest::MD5.hexdigest(Time.now.to_i.to_s)[0, 12]
params = {: id = > user_id}
u = Pingpp::User.create(params)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
userId := r.Intn(999999999999999)
params := &pingpp.UserParams{
ID: fmt.Sprintf("%d", userId),
Address: "中国.上海.浦东",
Email: "demo@pingxx.com",
}
return user.New("app_1Gqj58ynP0mHeX1q", params)
var uParams = new Dictionary < string,
object > {
{
"id", "test_user_001"
}, // 如果 ID 已使用,可以换成别的 ID,注意测试模式下最大用户数量限制
{
"email", "test_user@test.com"
}, {
"gender", "MALE"
}, {
"name", "Test Name"
},
};
var user = User.Create(appId, uParams);

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

{
"id": "test_user_003",
"object": "user",
"app": "app_1Gqj58ynP0mHeX1q",
"address": null,
"available_coupons": 0,
"avatar": null,
"available_balance": 0,
"withdrawable_balance": 0,
"created": 1470215837,
"disabled": false,
"email": null,
"gender": "MALE",
"identified": false,
"livemode": true,
"metadata": {},
"mobile": null,
"name": "name003",
"type": `customer`,
"related_app": null,
"settle_accounts": []
}

用户查询

Ping++ 提供接口可以通过用户 ID 查询单个用户对象及查询应用下所有用户列表。

单个用户查询

$uid = 'uid598ae2dabbe71';
try {
$user = \Pingpp\User::retrieve($uid);
echo $user;
} 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";
User obj = User.retrieve(userId);
pingpp.users.retrieve(
APP_ID,
'1477034484747', // 账户 ID
function(err, user) {
if (err != null){
console.log('pingpp.users.retrieve fail:', err);
}
// YOUR CODE
}
);
retrieve_user = pingpp.User.retrieve("test_user_01", app=app_id)
Pingpp::User.retrieve(get_user_id)
user.Get("app_1Gqj58ynP0mHeX1q", "test_user_002")
User.Retrieve(appId, user.Id)

用户列表查询

$params = [
'page' => 1,
'per_page' => 10,
];
$users = \Pingpp\User::all($params);
echo $users;
Map<String, Object> params = new HashMap<>();
UserCollection objs = User.list(params);
pingpp.users.list(
APP_ID,
{page: 1},
function(err, users) {
if (err != null){
console.log('pingpp.users.list fail:', err);
}
// YOUR CODE
}
);
user_list = pingpp.User.list()
Pingpp::User.list(:per_page => 3)
func (c *UserDemo) List() (*pingpp.UserList, error) {
params := &pingpp.PagingParams{}
params.Filters.AddFilter("page", "", "1") //取第一页数据
params.Filters.AddFilter("per_page", "", "2") //每页两个User对象
//params.Filters.AddFilter("created", "", "1475127952")
return user.List("app_1Gqj58ynP0mHeX1q", params)
}
User.List(appId)

注意事项

测试模式下的用户数量上限为 500 个,且已创建的用户不可删除。请勿在测试模式大量创建用户以免造成不便。