目录 |
校内网开放平台已经有半年多的时间了, 半年来平台上涌现出大量优秀的第三方app产品,随着这些app的日趋成熟以及用户群地不断增大,app开发者拓展盈利方式以及app用户购买虚拟道具的需求日趋强烈,在这种情况下,校内网开放平台团队推出了校内豆消费平台,以满足开发者和用户的需求,推动平台向更成熟、更完善的方向发展。
本文主要面向有一定开发经验并且在校内开放平台上有比较成功的app作品的开发者。
……
虚拟物品的市场,有引导用户完成消费、维护购物车、生成订单以及向REST API提交订单的职责。
向app提供保存订单和查询订单的接口。
用户完成付费流程的地方,在付费成功后,有回调app通知其订单支付成功,以及引导用户回到app内部指定页面的职责。
校内豆消费流程如下图所示(对于XNML型app,图中省略了XNML代理服务器):
以下流程与上图相对应。
用户在app中购买虚拟物品,并将物品放入购物车,用户购买完成后试图结算。
app生成订单,订单包含用户消费总额及订单号,调用REST API的pay.regOrder方法来保存订单。
REST API成功地保存订单后返回一个与该订单相关联的加密token。
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_res_user":12345,"app_res_order_id":1000001,"app_res_amount":100}
支付平台获得这个返回值后会进行数据校验,如果校验失败,也认为此次回调失败。 (增加这种约束的目的是为了强调上述三个关键数据,并且确保回调时app给用户加道具的逻辑已经顺利完成。)
用户付费成功后支付平台会立即回调App一次,如果App服务器返回的HTTP应答状态码是200,且回调返回值通过了数据校验,则认为此次回调成功,否则认为回调失败。对于失败的回调,支付平台会每隔3分钟重新回调一次,直到回调成功,最多持续回调8个小时。如果一个app每天回调失败的订单数量超过总量的1%,我们会认为此app提供的消费服务不够稳定,为了保证用户的权益,我们会暂时取消该app的校内豆消费资格。
注意:
App应当保证第N(N>=2)次收到平台回调的时候也能够正确地返回上述json对象,在正常情况下,平台在第一次回调成功后就不再继续回调了,但是如果在交互过程中网络出错或者其他原因造成App收到了回调,但是平台没有收到正确的应答,平台也会认为回调不成功,稍后会重新回调。
支付平台显示给用户支付成功的页面,并且引导用户回到app内部(redirect_url),用户回到领取道具的页面时,建议app调用pay.isCompleted接口来查询订单是否完成支付,不管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