开发者社区
社区提问意见反馈
开发者钉组织
扫描二维码
加入支付宝开发者钉组织
文档中心
凯发app官方网站的技术支持 & 案例 faq 
支付能力 > 当面付 > 案例分析 > 如何实现一码多付
收藏
我的文档
设置
通过一个二维码完成多种第三方凯发k8官方网娱乐官方的支付方式支付的需求:
商家打印一个静态的二维码,用户用 app(例如支付宝)扫这个二维码后,进入商家的一个付款页面,输入金额后,完成支付。
其技术实现方式如下:
生成二维码
通常线下场景是一个门店一个二维码,因此生成二维码时最好加入门店 id 参数。可以方便使用统一门店编号定位到是哪个商家的交易,结算给哪个商家,收款成功后通知给哪个商家。一般建议生成二维码的 url 不要太长,长度越短则生成的二维码识别率越高。
扫码识别
用户扫码时,可能会有许多种软件来扫,但能够处理支付宝交易的却只有支付宝客户端。因此需要做识别扫码来源并在页面作出提示,引导用户用支付宝扫码。用户用 app 扫商家的二维码后,其实是用 app 浏览器打开到商家的页面,商家页面通过识别浏览器 header 中的 user-agent 来判断是哪个 app 打开的。
常见 app 浏览器的 user-agent 识别关键字:
支付宝:alipayclient
微信:micromessenger
如果识别到不包含 alipayclient,则跳转到错误提示页面,引导用户用支付宝扫码。
支付宝扫码成功后,会将门店 id 提交到开发者的服务端,可以保存在 session 中或放在下一步的授权回调地址参数中。
获取用户信息
扫码成功后,需要先获取到扫码用户的 userid,不然下一步下单无法进行。
获取用户是使用支付宝的用户信息授权实现。
简单来说分为以下五步实现:
1拼接授权地址,包含授权范围和回调地址 (授权范围用这个 scope=auth_base,回调地址中可以包含一些参数:如门店 id);
2让用户浏览器跳转到授权地址,授权后用户浏览器会请求 redirect_uri 回调地址;
3授权后 redirect_uri 回调地址会收到 auth_code 参数;
4使用 auth_code 参数去换取 user_id 和 access_token (access_token)下单接口暂时使用不上,只需要使用 user_id 值);
5使用 access_token 可以去获取用户授权信息(这一步开发者一般用不上,授权范围为 scope=auth_user 时使用,可以获取用户更多信息);
以上几个步骤可以查看
拿到 user_id 后可以给下一步下单使用。
服务端拿到 user_id 后,user_id 可以存 session,也可以返回给用户页面隐藏域表单,并给用户页面显示付款页面。
下单
由于一码多付方案都是最简便方式,没有收银员输入金额的流程。
所以付款页面需要有输入框让用户填写付款金额,并提交表单发起付款。
目前已有了门店 id,付款方 userid,交易金额,开发者可以通过门店 id 在系统中查到配置的收款方账号信息。此时使用 发起下单,下单成功后,支付宝会返回支付宝交易号,使用 让用户付款。
服务端将脚本和订单号组装好返回给用户浏览器,用户支付宝浏览器会自动执行 js 并唤起收银台,让用户选择付款渠道和输入密码,完成付款。
完成付款后,用户页面会跳转到支付宝统一的付款成功页面。
获取收银结果
服务端获取用户的付款状态有两种方式:
轮询结果
服务端发起下单后就异步子线程向支付宝发起 交易查询 请求,每隔 5 秒查一次,查 1~2 分钟,一旦查到付款成功则终止,如果超时了还未付款,则发起 请求,避免用户在离店之后付款产生单边账纠纷。
异步通知
下单时,根据文档在交易创建接口中传递 notify_url 公共参数,则付款成功后支付宝会给这个 notify_url 地址发起回调付款结果。
获取异步通知付款结果可以查看 扫码支付异步通知说明
通知收银台服务端获取到付款成功的结果后,需要通知收银员(直接让用户拿手机付款结果给收银员看是有风险的,如:用户拿付款成功的截图欺骗收银员,或用户付款成功但商家未入账。)。
最简单的方式是调用短信接口通知这个门店的收银员。如果开发者之前没有自建短信发送渠道,可以使用如阿里云短信通知方案。
内容没有解决您的问题?您还可以前往 或 寻求帮助
凯发k8官方网娱乐官方 copyright © 2022 支付宝(杭州)信息技术有限公司  | icp证浙b2-20160559
该文档对你是否有帮助?
当前页面目录
网站地图