正文 统一支付设计思路 拾年之璐 V管理员 /2022-06-11 /425 阅读 0611 ## 0、开篇 统一支付是集成了**微信支付**、**支付宝支付**的支付平台。 ## 1、数据集设计 ### 1.1 订单数据 | 参数名称 | 变量 | 示例值 | 描述 | | :-------------------: | :----------: | :-----------------------------: | :----------------------------------------------------------- | | ID | id | 1 | 主键,索引 | | **应用ID** | appid | 202203018888 | UMS内的appid。 | | 交易单号 | trade_no | 2013112011001004330000121536 | | | 商户单号 | out_trade_no | 20150320010101001 | | | 商品名称 | title | 信息咨询服务 | 订单显示的标题 | | 订单金额 | amount | 88.88 | | | 交易状态 | status | WAIT、SUCCESS、CLOSED、FINISHED | 【必】等待付款、付款成功、交易关闭、交易结束(不可退款) | | **支付渠道** | pay_channel | wechat \| alipay | 【必】微信支付或支付宝支付。 | | 支付场景(方式) | pay_scene | qrcode | 默认qrcode。**qrcode**:扫码支付。返回二维码连接。**page**:支付宝电脑网站支付**wechat**:微信内支付 | | **回调地址** | notify_url | https://m.alipay.com/notify.php | 【必】用户支付成功后,服务器会主动发送一个post消息到这个网址 | | 返回地址 | return_url | https://m.alipay.com/Gk8NF23 | 【特殊必填】只有在**支付宝网站支付**情况下,才生效。 | | 取消地址 | cancel_url | https://m.alipay.com/Gk8NF23 | 取消支付返回网址。 | | 附加信息 | attach | 123 | 回调时,原样返回。 | | **创建时间** | create_time | 2022-3-31 15:41:36 | | | 支付时间 | paid_time | 2022-3-31 15:41:36 | | | 更新时间 | update_time | 2022-3-31 15:41:36 | | | 删除时间 | delete_time | 2022-3-31 15:41:36 | | ## 2、支付API 支付基本流程是: + 第四方平台通过API请求UMS,下单 + UMS校验请求,通过官方API下单,返回下单信息 + 第四发平台发起支付请求,用户下单 + 官方回调至UMS + UMS处理回调请求,官方已接收信息,同时异步向第四方平台发起回调 + 第四方接收回调,变更订单状态 + 交易结束。 ### 2.1 下单 + URI:[/api/payment/pay]() + 请求方式:POST + 请求参数: | 参数名 | 变量 | 实例值 | 描述 | | :-------------------: | :--------: | :------------------------------: | ------------------------------------------------------------ | | **应用ID** | appid | 202203018888 | 【必填】UMS内的appid。 | | **订单标题** | title | Image形象店-深圳腾大-QQ公仔 | 【必填】 | | **订单金额** | amount | 88.88 | 【必填】单位为人民币,精确到分。 | | **回调地址** | notifyUrl | https://m.alipay.com/notify.php | 【必填】用户支付成功后,服务器会主动发送一个post消息到这个网址 | | 返回地址 | returnUrl | https://m.alipay.com/Gk8NF23 | 【特殊必填】只有在**支付宝网站支付**情况下,才生效。 | | 取消地址 | cancelUrl | https://m.alipay.com/Gk8NF23 | 取消支付返回网址。 | | **支付渠道** | payChannel | wechat \| alipay | 【必填】微信支付或支付宝支付。 | | 支付场景(方式) | payScene | qrcode | 默认qrcode。**qrcode**:扫码支付。返回二维码连接。**page**:支付宝电脑网站支付**wechat**:微信内支付 | | 附加信息 | attach | 123 | 【选填】回调时,原样返回。 | | **时间戳** | time | 1648697040 | 【必填】https://tool.lu/timestamp/ | | **随机值** | nonce | 4cd72521485bd3bbf5403c5cdb85c86e | 【必填】 | | **签名** | hash | 15534a462aef2cb734634a3b005e1e89 | 【必填】32位签名。签名规则如下。 | + 返回参数 | 参数名 | 变量 | 实例值 | 描述 | | :------------: | :--------: | :----------------------------------------------------------: | ---------------------------------- | | **应用ID** | appid | 202203018888 | 【必】 | | **商户单号** | outTradeNo | 20150320010101001 | 【必】 | | 二维码 | qrcode | https://qr.alipay.com/bavh4wjlxf12tper3ahttps://qr.zxdmy.com/fsdfsdfsdgsfdgds | qrcode 场景下返回,二维码链接 | | 支付宝网站支付 | page | (支付页面HTML) | page 场景下返回, | | 微信支付内支付 | wechat | https://pay.zxdmy.com/wx/bavh4wjlxf12tper3a | wechat 场景下返回,微信支付链接 | | **时间戳** | time | 1648697040 | 【必填】https://tool.lu/timestamp/ | | **随机值** | nonce | 4cd72521485bd3bbf5403c5cdb85c86e | 【必】 | | **签名** | hash | 15534a462aef2cb734634a3b005e1e89 | 【必】32位签名。签名规则如下。 | + 细节设计: + 对于**二维码**,则前端直接展示即可,展示在**img**标签中; + 对于**网站支付**,则需要由前端渲染**html**标签,以便跳转至官方的支付页面。支付成功后,将跳转至用户设置的**returnUrl**; + 对于**微信内支付**,返回的是个链接,前端需要引导用户跳转至此页面。 + 此页面设置**支付**、**取消**两个按钮。完成支付后,跳转至**returnUrl**。取消支付,跳转至**cancelUrl**。 ### 2.2 官方回调 + URI:[/api/payment/notify]() + 方式:POST + 后台处理回调信息 ### 2.3 回调第四方 + URL:缓存读取第四方的URL + 方式:POST + 发送参数: | 参数名 | 变量 | 实例值 | 描述 | | :----------: | :--------: | :------------------------------: | -------------------------------------------------------- | | **应用ID** | appid | 202203018888 | 【必】 | | **交易单号** | tradeNo | 2013112011001004330000121536 | 【必】 | | **商户单号** | outTradeNo | 20150320010101001 | 【必】 | | **订单标题** | title | 东风导弹 | 【必】 | | **订单金额** | amount | 88.88 | 【必】 | | **订单状态** | status | WAIT、SUCCESS、CLOSED、FINISHED | 【必】等待付款、付款成功、交易关闭、交易结束(不可退款) | | 附加信息 | attach | 123 | 请求时包含该值的情况下,才返回。 | | **时间戳** | time | 1648697040 | 【必】 | | **随机值** | nonce | 4cd72521485bd3bbf5403c5cdb85c86e | 【必】 | | **签名** | hash | 4cd72521485bd3bbf5403c5cdb85c86e | 【必】 | ## 3、查询API ### 查询 + URI:[/api/payment/query]() + 请求方式:GET | POST + 请求参数: | 参数名 | 变量 | 实例值 | 描述 | | :----------: | :--------: | :------------------------------: | ---------------------------------- | | **应用ID** | appid | 202203018888 | 【必填】UMS内的appid。 | | **交易单号** | tradeNo | 2013112011001004330000121536 | 【特殊必填】二选一,权重高 | | **商户单号** | outTradeNo | 20150320010101001 | 【特殊必填】二选一 | | **时间戳** | time | 1648697040 | 【必填】https://tool.lu/timestamp/ | | **随机值** | nonce | 4cd72521485bd3bbf5403c5cdb85c86e | 【必】 | | **签名** | hash | 15534a462aef2cb734634a3b005e1e89 | 【必】32位签名。签名规则如下。 | + 返回参数: | 参数名 | 变量 | 实例值 | 描述 | | :----------: | :--------: | :------------------------------: | -------------------------------------------------------- | | **应用ID** | appid | 202203018888 | 【必填】UMS内的appid。 | | **交易单号** | tradeNo | 2013112011001004330000121536 | 【必】 | | **商户单号** | outTradeNo | 20150320010101001 | 【必】 | | **订单标题** | title | 东风导弹 | 【必】 | | **订单金额** | amount | 88.88 | 【必】 | | **订单状态** | status | WAIT、SUCCESS、CLOSED、FINISHED | 【必】等待付款、付款成功、交易关闭、交易结束(不可退款) | | 创建时间 | createTime | 2022-3-31 15:32:24 | 可能返回 | | 付款时间 | paidTime | 2022-3-31 15:32:22 | 只有支付成功才返回 | | **时间戳** | time | 1648697040 | 【必填】https://tool.lu/timestamp/ | | **随机值** | nonce | 4cd72521485bd3bbf5403c5cdb85c86e | 【必】 | | **签名** | hash | 15534a462aef2cb734634a3b005e1e89 | 【必】32位签名。签名规则如下。 | ## 附:签名规则 + 将所有请求的非空参数,按参数名的字典序,按照如下格式,从小到大排列,组合为**字符串A**: ```tex appid=202203018888&key2=value2&key3=value3 ``` + 然后,在组合后的字符串末尾,拼接AppSecret,组合为**字符串B**,如下所示: ```tex appid=202203018888key2=value2&key3=value3&AppSecret ``` + 最后,使用`MD5(B)`,即可得到**hash**值。 + 另外,注意: + 参数的值为空不参与签名; + 参数名区分大小写; + 验证调用返回或微信主动通知签名时,传送的hash参数不参与签名,将生成的签名与该hash值作校验。 本文采用创作共用版权 CC BY-NC-SA 3.0 CN 许可协议,转载或复制请注明出处! -- 展开阅读全文 --