订单取消

接入 Ping++ 订单接口,服务器端需要做的就是向 Ping++ 请求取消 Order 对象,具体步骤如下:

  1. 设置 API-Key
  2. SDK 验证签名设置
  3. 从服务端发起取消请求,获取 Order 对象

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

第三步:从服务端发起取消请求,获取 Order 对象

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

$order_id = '2011708070000007521';
try {
$pay = \Pingpp\Order::cancel($order_id);
echo $pay;
} catch (\Pingpp\Error\Base $e) {
if ($e->getHttpStatus() != null) {
header('Status: ' . $e->getHttpStatus());
echo $e->getHttpBody();
} else {
echo $e->getMessage();
}
}
exit;
Order order = Order.cancel("2001708220000280391");
pingpp.orders.cancel(
order.id,
function(err, order) {
if (err!=null){
console.log("pingpp.orders.cancel fail:",err)
}
}
);
cancel_param = {
"user": "10000000002" # 选填 用户 ID,传入该参数时,会检查该参数值与创建订单的用户 ID 是否一致。
}
cancel_result = pingpp.Order.cancel(order.id, **cancel_param)
should "execute should return an canceled order when passed correct id" do
begin
o = Pingpp::Order.cancel(order_to_cancel)
assert o.object == 'order'
assert o.kind_of?(Pingpp::Order)
assert o.status == 'canceled'
rescue => e
assert e.kind_of?(Pingpp::InvalidRequestError)
assert e.message.include?("已取消") || e.message.include?("canceled") ||
e.message.include?("expired") || e.message.include?("已过期")
end
end
func (c *OrderDemo) Cancel() (*pingpp.Order, error) {
return order.Cancel(c.demoUser, c.demoOrderID)
}
Order.Cancel(or.Id, new Dictionary<string, object> {
{"user", or.Uid}
}
);

Ping++ 收到取消请求后返回给你的服务器一个 Order 对象,下面是 Order 对象的一个示例:

{
"id": "2001708140000017551",
"object": "order",
"created": 1502695388,
"livemode": false,
"paid": false,
"refunded": false,
"status": "canceled",
"app": "app_1Gqj58ynP0mHeX1q",
"uid": "user_007",
"available_balance": 0,
"merchant_order_no": "2017081400000006",
"amount": 1000,
"actual_amount": 800,
"amount_refunded": 0,
"amount_paid": 0,
"coupon_amount": 200,
"currency": "cny",
"subject": "Your Subject",
"body": "Your Body",
"client_ip": "127.0.0.1",
"time_paid": null,
"time_expire": 1502781019,
"coupon": "300317081415225500002001",
"description": "",
"metadata": {},
"charge_essentials": {},
"receipt_app": "app_1Gqj58ynP0mHeX1q",
"service_app": "app_1Gqj58ynP0mHeX1q",
"available_methods": [],
"charges": {
"object": "list",
"url": "/v1/charges",
"has_more": false,
"data": [
{
"id": "ch_1Kyn50DyjXbHbvnv5SGK4qDK",
"object": "charge",
"created": 1502695440,
"livemode": false,
"paid": false,
"refunded": false,
"reversed": false,
"app": "app_1Gqj58ynP0mHeX1q",
"channel": "alipay_qr",
"order_no": "2017081400000006",
"client_ip": "127.0.0.1",
"amount": 800,
"amount_settle": 800,
"currency": "cny",
"subject": "Your Subject",
"body": "Your Body",
"extra": {},
"time_paid": null,
"time_expire": 1502781019,
"time_settle": null,
"transaction_no": null,
"refunds": null,
"amount_refunded": 0,
"failure_code": null,
"failure_msg": null,
"metadata": {},
"credential": {},
"description": null
}
]
}
}

注意事项

  1. 在超过订单有效期时,订单自动变为已取消状态。
  2. 订单创建时如果使用了优惠券,取消订单后优惠券会自动退回到相应的用户下。

下一步订单退款