登录/创建账户

目录

[编辑] 背景

校内网开放平台已经有半年多的时间了, 半年来平台上涌现出大量优秀的第三方app产品,随着这些app的日趋成熟以及用户群地不断增大,app开发者拓展盈利方式以及app用户购买虚拟道具的需求日趋强烈,在这种情况下,校内网开放平台团队推出了校内豆消费平台,以满足开发者和用户的需求,推动平台向更成熟、更完善的方向发展。

[编辑] 面向读者

本文主要面向有一定开发经验并且在校内开放平台上有比较成功的app作品的开发者。

[编辑] 摘要

……

[编辑] 系统主要角色

[编辑] app

   虚拟物品的市场,有引导用户完成消费、维护购物车、生成订单以及向REST API提交订单的职责。

[编辑] REST API

   向app提供保存订单和查询订单的接口。

[编辑] 支付平台

   用户完成付费流程的地方,在付费成功后,有回调app通知其订单支付成功,以及引导用户回到app内部指定页面的职责。

[编辑] 校内豆消费技术流程图

校内豆消费流程如下图所示(对于XNML型app,图中省略了XNML代理服务器): Image:Pay_flow.jpg

[编辑] 流程详细说明

以下流程与上图相对应。

[编辑] ①用户消费,结算

用户在app中购买虚拟物品,并将物品放入购物车,用户购买完成后试图结算。

[编辑] ②app生成、保存订单

app生成订单,订单包含用户消费总额及订单号,调用REST API的pay.regOrder方法来保存订单。

[编辑] ③REST API返回token

REST API成功地保存订单后返回一个与该订单相关联的加密token。

[编辑] ④app生成表单(form)

app生成支付表单给浏览器用户,表单的详细参数如下:

[编辑] 表单属性

   网页支付(WEB)订单请提交到:
   action(请务必填写绝对路径): http://app.renren.com/pay/web/submitOrder
   method: POST
   手机支付(WAP)订单请提交到:
   action(请务必填写绝对路径): http://app.renren.com/pay/wap/submitOrder
   method: POST/GET

[编辑] 表单参数

参数名 参数说明
app_id 系统分配的app_id
order_number 订单号,long型,数值范围[1,9223372036854775807]
token REST API返回的的加密token
redirect_url 用户在支付平台上完成付费后,支付平台引导用户回到app的url

[编辑] 示例

<form action="http://app.renren.com/pay/web/submitOrder" method="post"> <input type="hidden" name="app_id" value="12409"/> <input type="hidden" name="order_number" value="1001"/> <input type="hidden" size="50" name="token" value="13d33801d6be4ba88cdfcd664b1cc2bf"/> <input type="hidden" size="50" name="redirect_url" value="http://apps.renren.com/xnmlshell/shell.jsp?done=1"/> </form>

[编辑] ⑤用户提交表单、付费

用户提交支付表单到支付平台,并在支付平台上完成付费操作。

[编辑] ⑥支付平台回调

用户支付成功后,支付平台回调第三方服务器,通知其订单已经完成支付。

[编辑] 回调地址

开发者预设的回调URL,注意,请填写app服务器的url,而不是类似于http://apps.renren.com/myapp/some_path的url。

[编辑] 回调方式

支付平台服务器将使用HTTP请求的POST方法进行回调。

[编辑] 回调参数

参数名 参数说明
xn_sig_user 用户id
xn_sig_skey 验证安全码,值=MD5(password+userid),password在“我的应用”--“编辑人人豆支付信息”--“开发者信息”--“密码”
xn_sig_order_id 订单号

[编辑] 回调返回值

App应当返回一个json来表示此次消费的三个关键信息,即用户ID、订单号和校内豆数量,格式如下:

{"app_res_user":12345,"app_res_order_id":1000001,"app_res_amount":100}

支付平台获得这个返回值后会进行数据校验,如果校验失败,也认为此次回调失败。 (增加这种约束的目的是为了强调上述三个关键数据,并且确保回调时app给用户加道具的逻辑已经顺利完成。)

[编辑] 重复回调

用户付费成功后支付平台会立即回调App一次,如果App服务器返回的HTTP应答状态码是200,且回调返回值通过了数据校验,则认为此次回调成功,否则认为回调失败。对于失败的回调,支付平台会每隔3分钟重新回调一次,直到回调成功,最多持续回调8个小时。如果一个app每天回调失败的订单数量超过总量的1%,我们会认为此app提供的消费服务不够稳定,为了保证用户的权益,我们会暂时取消该app的校内豆消费资格。

  1. 收到回调请求后,app应该通过调用REST API pay.isCompleted来确认订单的支付状态(可选)。
  2. 由于对于一个订单,app可能收到多次来自平台的回调,所以请注意程序逻辑,以免造成不必要的损失。


注意: App应当保证第N(N>=2)次收到平台回调的时候也能够正确地返回上述json对象,在正常情况下,平台在第一次回调成功后就不再继续回调了,但是如果在交互过程中网络出错或者其他原因造成App收到了回调,但是平台没有收到正确的应答,平台也会认为回调不成功,稍后会重新回调。

[编辑] ⑦支付成功

支付平台显示给用户支付成功的页面,并且引导用户回到app内部(redirect_url),用户回到领取道具的页面时,建议app调用pay.isCompleted接口来查询订单是否完成支付,不管app是否收到平台的回调。


[编辑] 测试方案

我们提供了相关测试支付的环境,你只需要完成以下几步就可以进行测试,数据的提交保持和正式调用方式一样。

  • 提交校内豆申请(这步不能跳过,因为测试支付流程也需要回调地址等关键信息)
  • 将前面流程中第二步:app生成、保存订单中调用的pay.regOrder接口替换为pay4Test.regOrder。(手机支付时需要将type参数设置为1)
  • 将第四步:app生成表单的表单提交地址:
   网页支付测试(WEB)订单请提交到:
   action(请务必填写绝对路径): http://app.renren.com/pay/web4test/submitOrder
   method: POST/GET
   手机支付测试(WAP)订单请提交到:
   action(请务必填写绝对路径): http://app.renren.com/pay/wap4test/submitOrder
   method: POST/GET