订单创建及支付

一个订单的完整支付流程包含 下单支付,下单用于确认一笔订单的付款用户、商品信息、折扣信息、应付金额、分润信息。通过调用 Ping++ SDK 的 Order 接口可以实现生成一笔商品订单及支付功能。

一、下单

下单时除了订单基本信息之外,可以填写以下信息:

  • 优惠券 ID:如果需要使用优惠券进行折扣,可以根据优惠券模板的属性,计算出该笔订单优惠的金额。
  • 收款方应用:当子商户收款时,需将收款方填写为子商户的应用 AppID。收款方应用必须处于订单层级链中(包含首尾)。
  • 服务方应用:根据服务方应用在子商户层级树的位置,形成一条由服务方应用到平台应用的订单层级链,该链条上的应用均能看到这笔订单。
  • 分润信息:可以填写分润用户列表或者分润模板 ID。当订单支付成功后,才会对这些分润数据进行清分。

注:订单层级链相关信息可以参考 商户层级

order_create

  1. 用户在客户端选择商品和优惠券(可选,详情见 优惠券)并提交订单,客户端需要向你的服务端传递订单信息。注意:Ping++ SDK 不涉及你的客户端和你的服务端之间的数据交互,此处请你自定义通信方式。
  2. 服务端接收到客户端请求参数(若涉及多级商户的分润,还需要加上收款方、服务方以及分润用户信息列表参数),并调用 Server SDK 的创建订单 Order 对象的方法请求 Ping++。
  3. Ping++ 响应你的服务端请求,返回订单 Order 对象给你的服务端。
  4. 请在服务端核对订单 Order 对象中的商品信息和支付金额(特别是使用了优惠券的情况下),并返回给客户端。
  5. 客户端显示订单信息和相应的支付方式。
返回顶部
二、支付

创建好 Order 后,你可以对一笔待支付的订单发起订单支付,支付时需填写渠道相关信息。除了以下订单流程外,支付细节也可以参考 支付流程

order_pay

  1. 用户在客户端选择一个支付渠道,客户端需要向你的服务端发送订单金额和支付渠道名称;
  2. 服务端接收到客户端请求参数,并调用 Server-SDK 封装的支付 Order 对象方法请求 Ping++;
  3. Ping++ 响应你的服务端请求,返回带有支付凭据的 Order 对象(支付凭据用于 Client-SDK 调起支付控件);
  4. 你的服务端响应你的客户端请求,需要将该 Order 对象完整的返回给你的客户端, 注意: 1. 这里的 Order 返回类型必须是 JSON 格式,你可以参考:服务端应传递怎样的支付凭证给前端?;2. 扫码渠道请勿将 Order 传给前端,相似流程可参考 扫码支付
  5. 客户端拿到 Order 对象后,需要调用 Client-SDK 封装的方法调起支付控件、打开支付页面,用户完成支付;
  6. 第三方支付渠道会直接在客户端返回支付结果,此处不建议使用客户端的成功结果更新订单的最终状态;
  7. 在 Dashboard 配置 Webhooks 的 order.succeeded 事件。支付完成时,Ping++ 会主动以 POST 方式向你配置在 Dashboard 上的 Webhooks 通知地址发送支付结果,服务端的订单状态请根据 Webhooks 通知更新;同时,建议加上主动查询机制,订单支付完成后主动查询 Ping++ 订单状态,这样可以做到避免渠道或者 Ping++ 在极罕见的情况下的 Webhooks 延时回调问题。

注: 若同时配置了 order.succeeded 事件(必选)和 charge.succeeded 事件(可选),若是平台收款,则支付完成时平台会同时收到 order.succeeded 和 charge.succeeded 事件的推送;若是子商户收款,则支付完成时平台只会收到 order.succeeded 事件推送,子商户会收到 charge.succeeded 事件的推送(在已配置 Webhooks URL 的情况下)。

返回顶部

注意事项:

  1. 如果订单创建时使用优惠券折扣金额为订单总金额时(即订单应付金额为零),则订单支付时不需要选择支付渠道,但仍需要调用支付接口将订单变为已支付。
  2. 如果订单使用余额支付,用户如果同时包含(真实)余额和受赠余额,会优先扣除(真实)余额。在退款时,会优先退还受赠余额。
  3. 订单支付时默认使用订单中的商户订单号,也可以为每一笔支付指定不同的商户订单号。
  4. 订单在未付款时可以多次调用订单支付 API 进行支付,一旦订单变为已支付或已取消时,则不能再次请求支付 API。
  5. 除非支付超时,订单对于多次对同一渠道调用支付时,只会返回同一笔支付对象。在对不同渠道进行切换支付时,订单会保留最近一次支付发起时的支付凭证信息。
  6. 订单创建后,如果在订单有效期内没有完成支付,则订单状态会变为已取消。
  7. 因为渠道的原因,如果用户对一笔订单进行重复付款(例如打开支付宝控件,在未关闭的情况再次打开微信进行支付,微信支付完成再切回支付宝进行支付后,会有两次支付记录),可以对其中任何一笔支付做退款处理。
  8. 如果订单变为已取消(无论是超时还是主动调用)后,再对订单进行支付(指收到支付成功的异步通知),订单状态不会改变仍为已取消,但订单的是否付款和已付金额字段会发生相应的变化,你可以对这笔订单做退款处理。
  9. 使用扫码渠道时,请不要将服务端拿到的 Order 传给 Ping++ 的 Client-SDK。
  10. 组合支付使用的渠道不能和支付渠道相同。并且,订单已部分支付,不能再次组合支付,需要将订单全额退款后重新发起组合支付。

下一步订单取消