半岛官方体育【干货】微信支出
微信,几乎每个人都在用,应该是国内最高频,占用用户时间最长的软件了,所以当这个巨无霸社交软件加上支付能力,特别是那次春节推出的微信红包收割了大量用户,绑定了大量银行卡,微信支付就像插上了翅膀一样,飞速发展;马云当时还痛心的说,这是微信做的“偷袭珍珠港事件”。
本文对微信的发展和业务不做过多介绍,主要从支付系统的产品技术角度做剖析;
每一笔交易都会有一笔订单,比如我们去吃火锅,我们总得点菜吧,比如点个毛肚,鸭肠什么的,点好后,可能服务员就会在单子上写个第10桌,做个记录,这就是在下单;一样的,支付业务当中,也是需要下单的,比如你在京东买一个肾X,然后选择微信支付,那么这个时候京东就会调用微信支付的接口向微信支付下单,京东就会告诉微信支付,我这里有一笔9998元的交易来了,要用你微信支付来付款;然后微信支付就会用技术手段验证一下是不是京东来了,万一被冒充了呢;然后微信支付就会返给京东一个字符串(一般是数字)单号,当用户付款时候,京东又会拿着这个微信支付返回的单号进行付款;
注意:后文主要介绍该段落内容,除刷卡支付场景以外,商户系统先调用统一下单接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码支付、公众号支付、APP支付、小程序支付、H5支付等不同场景生成交易串调起支付;
订单按数量维度进行分类的话,可以分成单笔订单和多笔订单;单笔订单是比较好处理的,多笔订单处理对支付系统来说,是一件比较头疼的事情,这里概念介绍就不展开介绍了。
首先按照支付机构来说的话,常用的付款方式就是微信支付或支付宝,但是国内的支付机构一共有两百多家,其他支付机构也能提供像微信支付一样的服务;如果你用京东买东西的话,就会多一个选择,京东支付;
如果按照数量维度分类的话,付款跟订单一样,也分成了单笔和多笔付款;一般而言单笔订单对应一次单笔付款;有一种比较特殊情况,一笔订单对应多笔付款,比如一笔肾X的9998元的订单进行拆单,分成两次付款,第一次付款5000元,第二次付款4998元;但是市面上提供拆单服务的比较少,因为拆单业务处理起来相当棘手;
如果付款按照交易模式来说的话,可能分成即时到账和担保交易;比如你在菜市场扫了一个大妈的二维码付款,那么这笔交易的款项可以立马结算给这个大妈,这就是即时到账;担保交易,其实也很常见,比如你在京东买一个非自营的肾X,那么这笔款项应该是结算给对应的商户的,但是该款项一般不会立马结算给商户,而是付款人付款后,该款项会进入京东的账上,然后一定时间后,才会结算给商户;其实担保交易模式是支付宝首创,淘宝发展史上,为了解决买卖双方的信任问题,假如你在淘宝买一个东西,款项立马就给了商户,但是商户收到钱后,就不发货给你,把钱卷跑了怎么办,所以支付宝首创了担保交易模式;
付款按照支付方式来说的话半岛官方体育,可以分成余额支付,快捷支付,网银支付,线下支付,信贷支付等;余额支付,支付宝叫余额,微信支付叫零钱;网银支付,一般用于PC端,企业大额付款场景比如你要付款7万元,一般快捷支付的额度是不够用的;简单来说,网银支付就是你需要跳转到银行界面,使用U盾等验证措施鉴权,然后付款的方式;线下支付,一般不常见,但是支付宝和京东都有,比如说手机支付宝付款时界面有一个大额付款,点击一下就是线下支付,支付宝会提供一个收款账号,当你无论使用何种付款方式,甚至是去银行柜台打款都可以,当你付款到支付宝提供的这个收款账号,支付宝收到款项后就会处理这笔业务;
快捷支付,应该是支付业务中最最核心,也是最常见的付款方式了;有支付宝或微信支付使用经验的人应该都知道;快捷支付就两点,第一是绑卡,第二是付款;笔者已经在以前的文章码了几千字重点介绍过快捷支付了,
如果付款按照场景来分,不同的支付机构可以包装成不同的产品;以微信支付举例,这也是本文要重点介绍的业务;微信支付分成了公众号支付,刷卡支付,扫码支付,APP支付,H5支付,小程序支付;其中公众号支付刷卡支付对微信支付的发展功不可没,可以说是微信支付赶上支付宝的杀手锏;
注意:每个微信号都可以无须添加好友即可向对手方进行付款,还有微信提供的打赏能力,还有发红包,还有转账给好友的方式,这些方式一般仅仅只需要微信自行处理收付款方账户余额增减即可,一般还是免费的;这些都并非上文提到公众号支付,刷卡支付,扫码支付,APP支付,H5支付,小程序支付;本文提到的微信支付仅仅指需要技术服务商接入微信支付,然后进行资金转移的行为,而且这些服务都需要付费的。
一般支付机构对外除了提供下单和付款能力外,还会提供退款,退款查询,退款关闭,订单查询,订单关闭,订单撤销,对账等服务;这些能力也很重要,但是本文就不多做介绍了。
线商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信公众号支付完成下单购买的流程。
微信公众号支付不单单能用于上文提到的线上支付场景,还可以用于线下扫码场景;其实微信官方提供的扫码支付能力就是为了应用于线下的,但是许多技术服务商并没使用微信扫码支付,而是把公众号包装成了扫码支付;简单来说,你在使用微信扫一扫二维码进行付款的时候,有可能使用的是微信扫码支付能力,也有可能是微信公众号支付能力;
上文有举例在京东页面点击微信支付时候会唤起微信公众号支付插件;假如技术服务商自己的网址做成一个二维码,用户打开微信扫一扫后,打开了技术服务商的网址,这个页面,技术服务商做成了输入交易金额样式,这个页面就相当于上文提到的京东选择微信支付这种支付的页面;然后用户输入金额,确认支付后,技术服务商就会调用微信公众号支付,然后弹出公众号支付控件,用户输入支付密码确认付款;
多码合一,即不管你是使用微信扫一扫,支付宝扫一扫,还是京东扫一扫,QQ扫一扫,收钱吧都是提供的那个二维码;那收钱吧的那个二维码是怎么知道用户是使用微信扫,还是支付宝扫的呢,然后收钱吧才能知道是该调用微信支付,还是该调用支付宝。
这种多码合一方式,可先商户打印一个静态的二维码,顾客用app(比如支付宝、微信、百度钱包)扫这个二维码后,进入商户的一个付款页面,输入金额后,完成支付。用户用app扫商户的二维码后,其实是用app浏览器打开到商户的页面, 商户页面通过识别浏览器header中的user-agent来判断是哪个app打开的。
请确保实际支付时的请求目录与后台配置的目录一致,否则将无法成功唤起微信支付。比如上文提供收钱吧那个输入交易金额的页面目录可能为
)设置您的公众号支付支付目录,设置路径:商户平台--产品中心--开发配置。公众号支付在请求支付的时候会校验请求来源是否有在商户平台做了配置,所以必须确保支付目录已经正确的被配置,否则将验证失败,请求支付不成功;目前最多可设置5个设置授权域名
注意openid只有在公众号支付,小程序支付时候才需要,H5支付,扫码支付,刷卡支付不需要该参数,而获取openid则需要您在公众平台设置获取openid的域名,只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败; 比如上文提供收钱吧那个输入交易金额的页面的授权目录可能为目前只能设置一个。
微信公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,在支付业务中,最重要的基本信息就是openid了,当然还可以获取其他信息,比如用户的昵称、头像、性别、所在城市、语言和关注时间,但实现支付业务逻辑只需要openid;
按照获取用户信息的不同,可以分成用户静默授权和确认同意授权;支付页面中都是用的静默授权方式;
(1)、引导用户进入授权页面同意授权,获取code;授权可能是静默授权,用户无感知;
(2)、通过code换取网页授权access_token和openid;注意支付业务中,已经拿到了openid,可以不进行第三步;
(3)、通过网页授权access_token和openid获取用户基本信息;第三步需要用户在页面点击确认授权;
获取code在确保微信公众账号拥有授权作用域前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),即按照上文所说,在微信公众号后台设置了授权域名的情况下,引导关注者打开如下页面链接;;
该链接中有几个重要参数,这几个参数都由技术服务商确定,appid,公众号的唯一标识,每个公众号申请开通后,微信都会给这个公众号分配一个唯一的标识,即为appid;redirect_uri授权后重定向的回调链接地址;response_type 填写code; _redirect 无论直接打开还是做页面302重定向时候,必须带此参数;
请求后,微信会返回access_token和openid;access_token,网页授权接口调用凭证;openid,用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID;这个时候已经拿到了openid,已经可以调用微信下单接口,进行公众号支付,公众号支付要求openid必传,如果是支付业务已经可以不进行第三步了;
然后微信会返回openid用户的唯一标识;nickname用户昵称;sex用户的性别,值为1时是男性,值为2时是女性,值为0时是未知;province用户个人资料填写的省份;city普通用户个人资料填写的城市;country国家,如中国为CN;headimgurl用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。privilege用户特权信息,json 数组,如微信沃卡用户为(chinaunicom);
步骤(2):线上:用户选择购买,完成选购流程;线下:用户扫一扫商户自做的二维码,进入商户输入交易金额页面,然后用户确认支付后,商户调用微信下单接口,传入交易金额和openid等信息,然后微信支付会返回prepay_id(微信生成的预支付会话标识,用于后续接口getBrandWCPayRequest调用中使用,该值有效期为2小时)
一笔通过微信公众号进行支付的业务就完成了,其实主要分成三步走,第一步拿到openid,第二步通过openid向微信支付下单,第三步通过第二步下单后获取的单号向微信支付发起付款;当然后续还可能用到退款,退款查询,退款关闭,订单查询,订单关闭,订单撤销,对账等服务。
主要应用于超市,便利店等场景;简单来说,就是商家使用扫码枪扫描你的付款二维码;
步骤1:用户选择刷卡支付付款并打开微信,进入“我”-“钱包”-“收付款”条码界面;
需要注意,刷卡支付是下单和付款,对微信而言是同时进行的,只需要调用同一个接口进行下单和付款;而微信公众号支付,扫码支付,小程序支付,app支付,h5支付都是下单和付款分开的接口;
收银员使用扫码设备读取微信用户刷卡授权码以后,二维码或条码信息传送至商户收银台,由商户收银台或者商户后台调用该接口发起支付。
注意2:在调用查询接口返回后,如果交易状况不明晰,请调用【撤销订单API】,此时如果交易失败则关闭订单,该单不能再支付成功;如果交易成功,则将扣款退回到用户账户。当撤销无返回或错误时,请再次调用。注意:请勿扣款后立即调用【撤销订单API】,建议至少15秒后再调用。撤销订单API需要双向证书。
用户扫描商户展示在各种场景的二维码进行支付,微信提供的原生扫码支付一般不常见。市面上常见的扫码支付,都是技术服务商自己包装的扫码支付,而运用的能力为微信的公众号支付,支付宝服务窗支付能力;
步骤1:商户根据微信支付的规则,为不同商品生成不同的二维码,展示在各种场景,用于用户扫描购买。
按照二维码时效性分成动态二维码(两小时内有效)和静态二维码(二维码永久有效);
商户后台系统调用微信支付【统一下单API】生成预付交易,将接口返回的链接生成二维码,用户扫码后输入密码完成支付交易。注意:该模式的预付单有效期为2小时,过期后无法支付
该种二维码具有永久性,商户可把该二维码打印后放在店面里;一般适用于固定金额的商品;不常见
商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(商户可定义为产品标识或订单号)
URL实现的功能:接收用户扫码后微信支付系统回调的productid和openid),商户后台系统根据productid生成支付交易,最后微信支付系统发起用户支付流程。商户支付回调URL设置指引:进入商户平台--产品中心--开发配置,进行配置和修改
(1)商户后台系统根据微信支付规定格式生成二维码(规则见下文),展示给用户扫码。
适用于商户在移动端APP中集成微信支付功能。简单来说,就是商户的APP调用微信APP,然后再微信APP内完成支付。
步骤1:用户进入商户APP,选择商品下单、确认购买,进入支付环节。商户服务后台生成支付订单,签名后将数据传输到APP端;
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。
正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面。
由于设置redirect_url后,回跳指定页面的操作可能发生在:1,微信支付中间页调起微信收银台后超过5秒 2,用户点击“取消支付“或支付完成后点“完成”按钮。因此无法保证页面回跳时,支付流程已结束,所以商户设置的redirect_url地址不能自动执行查单操作,应让用户去点击按钮触发查单操作。回跳页面展示时,最好有弹窗让用户点击确认是否完成支付,用户点击后,商户向微信支付进行查询订单状态;
1. 商户侧统一下单传的终端IP(spbill_create_ip)与用户实际调起支付时微信侧检测到的终端IP不一致导致的,这个问题一般是商户在统一下单时没有传递正确的终端IP到spbill_create_ip导致,
2. 统一下单与调起支付时的网络有变动,如统一下单时是WIFI网络,下单成功后切换成4G网络再调起支付,这样可能会引发我们的正常拦截,请保持网络环境一致的情况下重新发起支付流程
1. 当前调起H5支付的referer为空导致,一般是因为直接访问页面调起H5支付,请按正常流程进行页面跳转后发起支付,或自行抓包确认referer值是否为空
1,当前调起H5支付的域名(微信侧从referer中获取)与申请H5支付时提交的授权域名不一致,如需添加或修改授权域名,请登陆商户号对应的商户平台--产品中心--开发配置自行配置
2,如果设置了回跳地址redirect_url,请确认设置的回跳地址的域名与申请H5支付时提交的授权域名是否一致
统一下单返回的MWEB_URL生成后,有效期为5分钟,如超时请重新生成MWEB_URL后再发起支付
1,请确认同一个MWEB_URL只被一个微信号调起,如果不同微信号调起请重新下单生成新的MWEB_URL
小程序支付与微信公众号支付十分类似,但是小程序支付不需要微信公众号的支付目录和授权域名
各银行、支付机构、清算机构应当建立支付业务系统接口统一管理制度,明确牵头部门,严格业务审批,加强接入单位审核、使用范围、交易信息和资金安全等管理。同时,加大交易监测力度,确保接入单位将支付业务系统接口用于协议约定的范围和用途,并采取有效措施防止支付业务系统接口被用于违法违规用途。各银行、支付机构之间不得相互开放和转接支付业务系统接口,预付卡发卡机构为其受理机构开放支付业务系统接口的,以及中国人民银行另有规定的除外。严禁银行、支付机构、清算机构支持或者变相支持无证机构经营支付业务。
最常规的普通模式,适用于有自己开发团队或外包开发商的直连商户收款。开发者申请自己的appid和mch_id,两者需具备绑定关系,以此来使用微信支付提供的开放接口,对用户提供服务
第三方服务商申请自己的服务号appid,并通过该服务号appid申请服务商mch_id,以此获得微信支付服务商能力。再通过服务商mch_id为所服务的特约商户申请创建微信支付sub_mch_id,创建好的sub_mch_id默认和服务商的mch_id建立父子授权关系。以此来使用微信支付提供的开放接口,对特约商户及用户提供服务。同时,微信支付为服务商模式下的每一条“mch_id-sub_mch_id父子授权关系”上,都开放了一些开发配置能力供服务商配置,包括不限于支付授权目录、推荐关注的appid、sub_appid等。拿小程序支付举例,服务商订单由哪个小程序调用js拉起支付,则需要在特约商户开发配置中将该小程序appid配置成sub_appid。每条父子关系上的sub_appid可以为多,用以满足不同的场景需求,但每笔交易只能使用1个。
最常规的第三方模式,第三方帮特约商户申请商户号并为他进行支付开发,第三方本身不经手资金,支付成功后资金直接进入特约商户商户号。半岛官方体育半岛官方体育