支付宝、微信支付(国内、国际版)走过的坑

目前为止,已经完成了支付宝(国内国际版)、微信(国内国际版)的开发,包括h5、微信公众号、app的支付开发。其中走过了很多的坑,记录下来,以后做这方面的朋友可以少走一些坑。接下来我也将从国内国际两个方向记录一下。
1、在生成公钥私钥以后,要上传公钥到支付宝开放平台获取支付宝公钥,以及公钥私钥在接口如何使用的就不具体讲了,遇到签名问题的时候请使用支付宝验签工具验证。另外需要注意一点,坑了我将近两小时的问题,我在收到支付宝异步回调的时候,是可以延签通过的,然后我进入到支付宝联调工具中把刚才回调的地址重新访问一遍,这个时候是需要注意的,因为这个时候已经将回调的参数拼接在了url后面,RSA加签出来的签名是有特殊字符的,然后就一直延签不通过。
2、微信方面由于没有sdk,所以需要自己写的部分相对多一些,其中在与ios对接的时候,发现死活调不起来微信,但是安卓却可以,浪费了将近半天的时候,最后修改了一个参数的长度,发现ios可以了。其中在调起支付接口中有一个参数timestamp,注意这个参数长度是10位的,但是java的时间戳长度默认是13位的,后来改成了10位就可以了。另外国内版微信有公众号支付、h5支付、app支付,分别是三种不同的接口。h5支付和app支付都可以在微信开放平台中申请的,但是公众号却需要在商户平台去绑定公众号的appid,这点需要注意一下,是需要不同的appid的,但是商户号可以使用同一个。
国际版的一个最大的特点就是效率慢,太慢了。相比国内多的接口就是报关接口。
国际版支付宝和国内的完全不同,使用的网关是mapi开头的地址,另外如果使用rsa的话,公钥是需要发送邮箱到支付宝海外团队的(需要他们返回支付宝公钥),在做国际版支付宝的时候遇到的一个最大的问题就是签名问题,支付宝延签工具也可以,客服也问了好久,可就是在唤醒的时候一直报签名错误,传递参数的值(包括sign)中如果存在特殊字符(如:、@、/、+、{}等),那么该值需要做URL Encoding,这一点一定要特别注意,一定要做url encoding操作,不然会坑死自己的。另外国际版支付宝是需要有资金单位的,还没有rmb结算的时候,所以在开发的时候统一使用了美元。
国际版微信在申请填写手机号的时候不要加+86,不然你会收到设置api密钥的时候收不到短信的魔咒。另外国际版微信是需要商户号和appid手动绑定的
关于支付宝的公钥与私钥
以下只讲原理,不讲实际操作
加密技术
支付宝支付时,通讯信息的加密算法使用的是 非对称加密算法 ,意思钥匙有两把,其中一把对数据进行加密后,需要使用另外一把钥匙才能将其解密,也就是公钥(public key)和私钥(private key)。私钥自己保存,切勿被别人知道,公钥是公开的,给人知道也没关系。
商户的公钥与私钥,用于发起支付
商户使用 支付宝官方指导文档 的openssl工具在本地生成的公钥和私钥,然后将生成的 公钥 上传到支付宝商家后台,支付时,我们使用该 私钥 对订单信息加密,支付宝服务端收到该加密信息后会拿商户后台上传的公钥对该信息进行解密。
支付宝的公钥与私钥,用于回调
支付宝有个公开的公钥,所有的商户使用的支付宝公钥都是同一个。支付成功或失败后,支付宝服务端要回调告诉我们支付结果,会拿私钥对该回调信息进行加密,我们收到该信息要拿支付宝的公钥进行解密。
支付宝.net支付宝公钥 开发者公钥分别怎么获得
要电脑端windows下操作。首先打开openssl文件。双击opennssl.exe文件。出现一个命令框。打开命令框输入第一行命令。生成私钥。回车接着输入第二行命令生成公钥。按回车输入第三行命令。将RSA私钥转换成PK c s8格式。执行命令后生成两个pem文件在bin目录下。复制到桌面。改成txt格式。公钥获取登录点击查看pidkey.在新页面查看签约账号。合作身份ID输入密码查询key获取公钥。上传rsa公钥。点击加密后添加密钥。把自己的公钥复制进去确认上传如成功就可以查看公钥