支付宝支付-移动接口
1. 商户签约审核
1.1商户在b.alipay.com里进行产品签约;(其中,点击右上角的 ,可详细了解签约的过程)
1.2在线申请,点击
进入下级页面后,选择好套餐后,点击
1) 填写相关信息。
(注意刚进去时,默认是网站网址,要选择应用或其他附件)
填完信息,点击同意并提交 按钮后,等待审核
商户登录qy.alipay.com,可在“签约订单”中查看审核进度
2. 查看Pid和Key
审核成功后,登陆https://b.alipay.com/order/serviceIndex.htm
登陆账号后,选择上传的应用,查看Pid和Key.
网址是https://b.alipay.com/order/pidAndKey.htm
即可查询到合作者身份ID,以2088开头的16位纯数字。
输入支付密码,查询key
3. 集成支付宝
3.1 集成准备
集成前需要有PID、Key、企业支付宝的账号;
3.2 下载demo
在【技术支持】里下载demo了:https://b.alipay.com/order/techService.htm
1) Demo介绍
其中openssl下是生成密钥和公钥(支付时,需要)
客户端demo 下有Android和iOSd的demo和文档
2) 支付宝Demo和SDK
解压支付宝钱包支付接口开发包2.0标准版(Android 15.0.8).zip进去后一个是sdk,另一个是demo 导入demo到Eclipse或AS
3) 私钥生成和公钥生成
生成RSA私钥,RSA公钥,PKCS8编码的私钥
打开openssl文件夹下的bin文件夹,执行openssl.exe文件,如下图:
生成RSA私钥
输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前bin文件目录中会新增一个rsa_private_key.pem文件,其文件为原始的商户私钥(请妥善保存该文件,PHP开发语言中需要使用该文件),以下为命令正确执行截图
生成PKCS8编码的私钥
输入命令“pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt”并回车,当前界面中会直接显示出生成结果:
右键点击openssl窗口上边边缘,选择“编辑→标记”,选中要复制的文字:
此时继续右键点击openssl窗口上边边缘,选择“编辑→复制”,把复制的内容粘贴进一个新的记事本中,可随意命名,只要知道这个是PKCS8格式的私钥即可(请妥善保存该文件)。
4) 与支付宝互换公钥,得到支付宝返回的公钥
商户在使用RSA签名方式的支付宝接口时,真正会用到的密钥是商户私钥与支付宝公钥。商户上传公钥给支付宝,支付宝把公钥给商户,是公钥互换的操作。这就使得商户使用自己的私钥做签名时,支付宝端会根据商户上传的公钥做验证签名。商户使用支付宝公钥做验证签名时,同理,也是因为支付宝用支付宝私钥做了签名。
支付宝的RSA公钥为:
—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRA
FljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQE
B/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5Ksi
NG9zpgmLCUYuLkxpLQIDAQAB
—–END PUBLIC KEY—–
(1) 把支付宝的公钥复制到新建的记事本中,并对该记事本命名为“alipay_public_key.txt”;
(2) 去掉这串字符串中的回车、换行、空格,变成只有一行文字;
(3) 在这串支付宝公钥字符串的头尾部分,分别增加“—–BEGIN PUBLIC KEY—–”、“—–END PUBLIC KEY—–”这两条文字;
(4) 切割这串支付宝公钥字符串,第一行、第二行、第三行分别是64个字符,第四行是24个字符,切割后的格式与商户刚生成的公钥格式一致即可,如下图:
(5) 保存该记事本,并改变后缀名为.pem。
3.3 配置Demo
在PayDemoActivity中配置几个变量:
现在运行demo就直接可以支付了。详细的demo讲解 参考http://blog.csdn.net/harvic880925/article/details/49779061
3.4 支付宝集成到项目中
I. 把alipaySDK-20150602.jar拷贝到lib下,将demo中的PayResult.java;SignUtils.java;Base64.java,复制到项目工程中.
II. 参考PayDemoActivity 写支付宝支付过程。
4. 注意点(可能会出错点)
支付宝主要的几个参数 :收款时的支付宝账号;
密钥pkcs8;
支付宝公钥(并非本地生成的,而是客户返回来的公钥)
商户PID
在调用订单时,不能漏任何一个参数,详见demo
另外 订单中的金额 格式必须是 0.01,其他的比如0.001 会失败
微信支付-移动接口
5. 客户接入微信支付
5.1 APP微信商户申请
进入https://pay.weixin.qq.com/index.php/home/login?return_url=%2F
选择下方的
注意是APP支付,不要选择公众号支付
1) 注册开放平台账号。
2) 认证开发者资质
注册好账号后,登陆,点击账号中心,当中的开发者资质认证,如图
一步步填写好认证所需的内容后,等待认证。
3) 创建应用
在管理中心,添加应用,如图
4) 选择平台
其中应用签名是用微信提供的工具签名,签名工具下载地址
https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
5) 如何签名?
如图
图中,讲得有点复杂。应用签名获得方式:①将应用app打包出来,安装到手机中;②打开已下载好的微信签名工具,输入应用app的包名;③点击按钮后,得到的绿色一串就是应用签名(无法复制)。
注意:打包不能用debug.keystore。
6) 按图第二阶段操作
6. 集成微信支付
6.1 微信支付集成 文档
参看https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
6.2 微信支付Demo
1) 下载Demo
从https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1 下载
Android【微信支付】APP支付示例
2) 将Demo导入Eclipse或AS
3) 微信支付Demo讲解
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, “wxd930ea5d5a258f4f”); // 将该app注册到微信 //"wxd930ea5d5a258f4f"为appId
从Demo中可看出,一些重要的支付请求参数,都是从服务器传过来的,请求参数详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12
6.3 微信支付集成到项目
1) 配置项目中的微信支付
将Demo的libs下的libammsdk.jar复制到项目中的libs。
将
复制到项目中去,改掉,包名,但是.wxapi, 不能变。其中WXPayEntryActivity 是微信支付的返回,可在这个Activity 重写支付成功和失败的操作。
将Constants.java,MD5.java,PayActivity.java,util.java拷贝到项目下。
2) 在AndroidManifest.xml 配置
(1)AndroidManifest.xml中package名字和项目包名一样;
(2)AndroidManifest.xml中添加.wxapi.WXPayEntryActivity
3) 具体调用 (参照Demo)
4) 处理支付结果
接收支付结果的WXPayEntryActivity中的onResp函数里处理支付结果,如下图
7. 微信支付集成常见的问题
7.1 测试返回的支付结果是-1
1) 应用签名不一致
应用提交的应用签名,是由XX.keystore文件打包的,测试时,就必须用XX .keystore 打包出来,调用微信支付
2) 应用签名错用debug.keyStore打包(不能用debug.keyStore)
3) 应用包名不一致
应用包名变过了,需要去微信提交应用那更新
4) 后台不一致
后台参数不正确
5) 价格单位是分
如1元,需写成100;写成1.00会调用失败
6) body是中文
body是中文的时候需要字符转换
7) 未清除微信的数据
这是微信支付比较坑爹的地方:在测试机中引起微信支付失败时,微信数据会储存失败记录并保持不变,那么你再次安装应用,并且应该能调微信支付成功,会一直导致-1结果。
记得删除微信缓冲数据(设置-》应用程序管理器->选中微信->清除数据)
8) Demo的注册语句未修改。
详见6.2下面的4)
8. 交付后遇到的一些问题
1) 支付宝的服务器异步通知页面路径 没有配置,
导致后台接受不到订单是否支付。(这个需要App这里配置)
2) 微信支付的订单返回地址 没有配置 ,导致后台接受不到订单是否支付。(这个需要后台配置)