第三方支付自我总结(转)
最近公司有新的业务需求,在同一个域名中接入两个收款账号,包括支付宝、微信、银联。之前都是一个域名一个收款账号,并且他们的备案主体是相同的。在接到需求之后咨询了支付宝、微信、银联各自的客服是否可以在一个域名同时接入两个公司的收款账号,得到的答案都是否定的。因为公司的ICP备案主体与收款账号的备案主体不同所以不支持。后来换做别的同事来咨询对方又不完全否定,说是没有明文规定可以或者不可以,于是乎抱着“法不禁止皆允许”的态度开始张整。首先是域名备案主体的授权备案,各种申请、签约、经过测试环境测试最终达到了目的。(暂时没有上生产,具体情况待后续更新)
借此机会,自己也回顾了下第三方支付的一些流程(PC端)、仅仅是自己的理解,不喜勿喷。
一、微信支付
首选,需要申请微信公众平台(需要填写一些公司信息 注册号 营业执照等),并且申请支付功能。审核通过之后会看到自己应用的APPID以及分配到的微信支付商户号 以及密钥。
进入微信公众平台后台,找到开发者中心,修改网页授权获取用户信息、填写自己的域名。
然后通过微信商户平台登录 账户中心-API安全 中设置自己的秘钥(key)输入32位的秘钥、自己定义一个数字进行MD5加密。这里支付平台就设置完毕。
接下来的开发工作就需要参考开发者中心的文档进行了,首先微信支付有两种支付模式,结合自己的需求选择、这里我选择模式二(具体文档见:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1)
因为模式二与模式一相比,流程更为简单,不依赖设置的回调支付URL。商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付。这是微信官方讲解、相对来说也比较通俗易懂,
1、就是获取自己的订单信息与自己的商户信息结合、组装成参数调用微信的统一下单接口,其中Sign签名生成方法简单理解如下:
1.1 微信支付中将数据里面的内容进行鉴权、确定携带信息的真实、有效、合理、因此这里将定义生成sign字符串的方法。
a、对所有传入参数按照字段名ASCII码从小到大排序后使用键值对的格式(即key1=value1&key2=value2..)拼成字符串string ,注意值为空的参数不参与签名;
b、在string最后拼接上key=key(商户支付密钥)得到stringSignTemp 字符串 并对其进行md5运算,再将得到的字符串所有字符转换为大写,得到sign值
具体生成sign签名的方法SDK中可以找到
具体参数请见(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)
2、接下来从微信支付返回信息中解析出code_url 然后调用生成二维码的方法生成二维码、当微信支付成功之后会调用之前预支付订单中的notify_url地址返回支付成功。注意 很多人会遇到微信反复调取支付成功接口导致错误,所以在接收到支付成功请求时必须加标识是否已经处理过或者加标识、验证通过之后再走自己的业务流程。
3、也可以调用查询接口查询是否支付成功。
时间原因 今天先写微信了 改天写支付宝