0%

支付

支付又称付出、付给,多指付款,是发生在购买者和销售者之间的金融交换,是社会经济活动所引起的货币债权转移的过程。支付包括交易、清算和结算。

一、微信支付

  1. 分类

  2. 例子

①Native支付流程

  • 模式一:商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号)。用户扫码后,微信支付系统将productid和用户唯一标识(openid)回调商户后台系统(需要设置支付回调URL),商户后台系统根据productid生成支付交易,最后微信支付系统发起用户支付流程。

    • 业务流程时序图

      扫码支付模式一

    • 支付流程

      • 商户后台系统根据微信支付规定格式生成二维码(规则见下文),展示给用户扫码。
      • 用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
      • 微信支付系统收到客户端请求,发起对商户后台系统支付回调URL的调用,调用请求将带productid和用户的openid等参数,并要求商户系统返回交数据包
      • 商户后台系统收到微信支付系统的回调请求,根据productid生成商户系统的订单。
      • 商户系统调用微信支付【统一下单API】请求下单,获取交易会话标识(prepay_id)
      • 微信支付系统根据商户系统的请求生成预支付交易,并返回交易会话标识(prepay_id)。
      • 商户后台系统得到交易会话标识prepay_id(2小时内有效)。
      • 商户后台系统将prepay_id返回给微信支付系统。返回数据见”本节3.2回调数据输出参数”
      • 微信支付系统根据交易会话标识,发起用户端授权支付流程。
      • 用户在微信客户端输入密码,确认支付后,微信客户端提交支付授权。
      • 微信支付系统验证后扣款,完成支付交易。
      • 微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
      • 微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
      • 未收到支付通知的情况,商户后台系统调用【查询订单API】。
      • 商户确认订单已支付后给用户发货。
  • 模式二:商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付。

    • 业务流程时序图

      扫码支付模式二

    • 支付流程

      • 商户后台系统根据用户选购的商品生成订单。
      • 用户确认支付后调用微信支付【统一下单API】生成预支付交易;
      • 微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
      • 商户后台系统根据返回的code_url生成二维码。
      • 用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
      • 微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
      • 用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
      • 微信支付系统根据用户授权完成支付交易。
      • 微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
      • 微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
      • 未收到支付通知的情况,商户后台系统调用【查询订单API】。
      • 商户确认订单已支付后给用户发货。

②JSAPI支付

  • 设置支付目录:请确保实际支付时的请求目录与后台配置的目录一致(现在已经支持配置根目录,配置后有一定的生效时间,一般5分钟内生效),否则将无法成功唤起微信支付。
  • API支付时,在统一下单接口中要求必传用户openid,而获取openid则需要您在公众平台设置获取openid的域名,只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败。
  • 业务流程时序图
    jsapi
  1. important

①统一下单接口 https://api.mch.weixin.qq.com/pay/unifiedorder

字段名 变量名 必填 类型 示例值 描述
公众账号ID appid String(32) wxd678efh567hg6787 微信支付分配的公众账号ID(企业号corpid即为此appId)
商户号 mch_id String(32) 1230000109 微信支付分配的商户号
随机字符串 nonce_str String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,长度要求在32位以内。推荐随机数生成算法
签名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 通过签名算法计算得出的签名值,详见签名生成算法
商品描述 body String(128) 腾讯充值中心-QQ会员充值 商品简单描述,该字段请按照规范传递,具体请见参数规定
商户订单号 out_trade_no String(32) 20150806125346 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-
标价金额 total_fee Int 88 订单总金额,单位为分,详见支付金额
终端IP spbill_create_ip String(64) 123.12.12.123 支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP
通知地址 notify_url String(256) http://www.weixin.qq.com/wxpay/pay.php 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
交易类型 trade_type String(16) JSAPI JSAPI -JSAPI支付
NATIVE -Native支付
APP -APP支付 说明详见参数规定
设备号 device_info String(32) 013467007045764 自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传”WEB”
签名类型 sign_type String(32) MD5 签名类型,默认为MD5,支持HMAC-SHA256和MD5。
商品详情 detail String(6000) 商品详细描述,对于使用单品优惠的商户,改字段必须按照规范上传,详见“单品优惠参数说明”
附加数据 attach String(127) 深圳分店 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
标价币种 fee_type String(16) CNY 符合ISO 4217标准的三位字母代码,默认人民币:CNY,详细列表请参见货币类型
交易起始时间 time_start String(14) 20091225091010 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
交易结束时间 time_expire String(14) 20091227091010 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。订单失效时间是针对订单号而言的,由于在请求支付的时候有一个必传参数prepay_id只有两小时的有效期,所以在重入时间超过2小时的时候需要重新请求下单接口获取新的prepay_id。其他详见时间规则 建议:最短失效时间间隔大于1分钟
订单优惠标记 goods_tag String(32) WXG 订单优惠标记,使用代金券或立减优惠功能时需要的参数,说明详见代金券或立减优惠
商品ID product_id String(32) 12235413214070356458058 trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义。
指定支付方式 limit_pay String(32) no_credit 上传此参数no_credit–可限制用户不能使用信用卡支付
用户标识 openid String(128) oUpF8uMuAJO_M2pxb1Q9zNjWeS6o trade_type=JSAPI时(即JSAPI支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换
电子发票入口开放标识 receipt String(8) Y Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效
场景信息 scene_info String(256)

②支付结果通知

应用场景:支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。

  • 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
  • 后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起10次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),但微信不保证通知最终一定能成功。
  • 在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付【查询订单API】确认订单状态。

二、支付宝支付

  1. 分类

  2. 例子

①电脑网站支付

  • 第一步:创建应用
  • 第二步:配置密钥
  • 第三步:搭建和配置开发环境
  • 第四步:接口调用
    • 商户系统请求支付宝接口alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重定向至用户登录页面。
    • 用户确认支付后,支付宝get请求returnUrl(商户入参传入),返回同步返回参数。
    • 交易成功后,支付宝post请求notifyUrl(商户入参传入),返回异步通知参数。
    • 若由于网络等问题异步通知没有到达,商户可自行调用alipay.trade.query接口进行查询,根据查询接口获取交易以及支付信息(商户也可以直接调用查询接口,不需要依赖异步通知)。
      网站支付
  1. important

①服务器异步通知页面特性

  • 必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等;
  • 支付宝是用POST方式发送通知信息,因此该页面中获取参数的方式,如:request.Form(“out_trade_no”)、$_POST[‘out_trade_no’];
  • 支付宝主动发起通知,该方式才会被启用;
  • 只有在支付宝的交易管理中存在该笔交易,且发生了交易状态的改变,支付宝才会通过该方式发起服务器通知(即时到账交易状态为“等待买家付款”的状态默认是不会发送通知的);
  • 服务器间的交互,不像页面跳转同步通知可以在页面上显示出来,这种交互方式是不可见的;
  • 第一次交易状态改变(即时到账中此时交易状态是交易完成)时,不仅会返回同步处理结果,而且服务器异步通知页面也会收到支付宝发来的处理结果通知;
  • 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
  • 程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到success字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知;
  • cookies、session等在此页面会失效,即无法获取这些数据;
  • 该方式的调试与运行必须在服务器上,即互联网上能访问;
  • 该方式的作用主要防止订单丢失,即页面跳转同步通知没有处理订单更新,它则去处理;
  • 当商户收到服务器异步通知并打印出success时,服务器异步通知参数notify_id才会失效。也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出success导致支付宝重发数次通知),服务器异步通知参数notify_id是不变的。