更新时间:2024-11-12 10:53:40收藏我的文档设置返回文档通过一个二维码完成多种第三方凯发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 地址发起回调付款结果。获取异步通知付款结果可以查看 扫码支付异步通知说明。通知收银台服务端获取到付款成功的结果后,需要通知收银员(直接让用户拿手机付款结果给收银员看是有风险的,如:用户拿付款成功的截图欺骗收银员,或用户付款成功但商家未入账。)。最简单的方式是调用短信接口通知这个门店的收银员。如果开发者之前没有自建短信发送渠道,可以使用如阿里云短信通知方案。