撤销
调用 Ping++ 接口发起撤销,在订单状态不明时可以调用该接口撤销订单。对于未成功付款的订单进行撤销,则关闭交易。此接口仅接受 wx_pub_scan
、cb_wx_pub_scan
、alipay_scan
、cb_alipay_scan
、upacp_scan
、isv_scan
、isv_wap
、isv_qr
渠道的订单调用,仅需要 Ping++ Server SDK 即可,服务器端需要做的就是向 Ping++ 请求撤销 Charge 接口,具体步骤如下:
- 设置 API-Key
- SDK 验证签名设置
- 服务端发起撤销请求获取 Charge 对象
第一步:设置 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 模式
注意: 一旦上传公钥至 Ping++ 管理平台并启用 Live 模式,则验证签名功能即时生效,Ping++ 会立即验证你的真实线上交易验签请求。如果私钥为空或错误,则会交易失败,所以请确保测试模式正常后再启用 Live 开关。
第三步:服务端发起撤销请求获取 Charge 对象
调用 Ping++ Server SDK 发起撤销请求,此请求所需参数具体可参考 API 文档。
$ch = \Pingpp\Charge::reverse('ch_id');//ch_id 是未付款的订单号
Charge ch = Charge.reverse("ch_id");//ch_id 是未付款的订单号
pingpp.charges.reverse( 'ch_id',//ch_id 是未付款的订单号 {}, function(err, charge) { if (err != null){ console.log(err); } else { console.log(charge); } // YOUR CODE });
ch = pingpp.Charge.reverse("ch_id") #ch_id 是未付款的订单号
ch = Pingpp::Charge.reverse("ch_id")# ch_id 是未付款的订单号
ch, err := charge.Reverse("ch_id")//ch_id 是未付款的订单号if err != nil { log.Fatal(err)}chstring, _ := json.Marshal(ch)log.Printf("%v\n", string(chstring))
var ch = Charge.Reverse(ch_id);//ch_id 是未付款的订单号
Ping++ 收到撤销请求后返回给你的服务器一个包含撤销状态的 Charge 对象,下面是 Charge 对象的一个示例:
{ "id": "ch_injTG4KGWPePS88WPGPyfzz5", "object": "charge", "created": 1495694197, "livemode": true, "paid": true, "refunded": false, "reversed": true, "app": "app_4OOi9SGuD88GGqbL", "channel": "isv_scan", "order_no": "149569419725834", "client_ip": "127.0.0.1", "amount": 1, "amount_settle": 1, "currency": "cny", "subject": "cm isv_scan", "body": "cm isv_scan", "extra": { "scan_code": "130141564083799183", "terminal_id": "00000001", "pay_channel": "wx", "buyer_account": "omYJss9x8g2TzmrxnUtrOr7qWhwc", "chcd_discount": "0.00", "mer_discount": "0.00" }, "time_paid": 1495694546, "time_expire": 1495780597, "time_settle": null, "transaction_no": "4002362001201705252516756579", "refunds": { "object": "list", "url": "/v1/charges/ch_injTG4KGWPePS88WPGPyfzz5/refunds", "has_more": false, "data": [] }, "amount_refunded": 0, "failure_code": null, "failure_msg": null, "metadata": {}, "credential": {}, "description": null}
注意事项
对于成功付款的订单请使用 退款 接口进行退款处理。只有针对未支付或状态不明的订单,我们建议你调用撤销接口。
下一步退款