android 支付宝第三方支付
支付宝集成文档
一、申请移动支付权限
首先登录【支付宝开放平台】http://open.alipay.com/platform/home.htm,添加应用,申请移动支付权限。申请开通支付,是需要公司文件的,个人是不允许开始支付的。
二、阿里支付DEMO
自己去下载
2、配置几个变量
这部分会对代码中用到的几个变量的找到方法或生成方法进行讲述,部分资料引自支付宝开放平台。
(1)PID
合作者身份ID(PID)是商户与支付宝签约后,商户获得的支付宝商户唯一识别码。当商户把支付宝功能接入商户网站时会用到PID,以便让支付宝认证商户。
查看PID步骤如下:
1、登录支付宝官方网站b.alipay.com
2、点击导航栏中“商家服务”
3、点击“查询PID、Key”
(2)、APPID、APP SECRET和支付宝公钥
在https://openhome.alipay.com/platform/createApp.htm页面,创建一个应用
完成之后:在我的应用中是可以看得到的:
然后转到帐户基本信息页面:https://openhome.alipay.com/platform/keyManage.htm
在开放平台密钥栏,可以找到APPID,APP SECRET,和支付宝密钥
这三个数据,都是在应用创建后,支付宝为我们生成好的,无法更改!
(3)、生成商户私钥【windows生成方法】
(有关mac的生成方法,下面会再补充)
1、下载DEMO及SDK
到文档中心,查看移动支付对应的文档,文档地址:http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1
然后,点击(SDK&DEMO下载)下载代码
2、得到原始私钥
在代码中的DEMO/openssl/bin目录下,有openssl.exe文件
打开openssl.exe
输入
genrsa -out rsa_private_key.pem 1024
得到生成成功的结果,如下图:
此时,我们可以在bin文件夹中看到一个文件名为rsa_private_key.pem的文件
用记事本方式打开它,可以看到-----BEGIN RSA PRIVATE KEY-----开头,-----END RSA PRIVATE KEY-----结尾的没有换行的字符串,这个就是原始的私钥。
但这段原始私钥代码中是用不到的,我们需要将它转化为PKCS8格式
3、转换为PKCS8格式
在openssl.exe中输入:并回车
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
得到生成功的结果,这个结果就是PKCS8格式的私钥,如下图:
注意,私钥是红框包括的那部分,是不包含BEGIN PRIVATE KEY和END PRIVATE KEY这两行的。
右键点击openssl窗口上边边缘,选择编辑→标记,选中要复制的文字(如上图),
此时继续右键点击openssl窗口上边边缘,选择编辑→复制,
把复制的内容粘土进一个新的记事本中,可随便命名,只要知道这个是PKCS8格式的私钥即可。
(4)、生成商户私钥【MAC生成方法】
这里来讲一下mac端如何生成用户私钥的,由于mac系统是自带openssl的,所以只需要打开终端,利用cd命令切到任意一个想存放生成Key的文件夹下:
比如,切到下载目录下
然后运行下面的命令来生成私钥原始密钥
openssl genrsa -out rsa_private_key.pem 1024
然后运行下面的命令来生成转换的PCKS8格式的命令。
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
然后将生成的私钥复制保存起来。
从上面的命令可以看出,与windows相比,mac上需要在前面添加openssl指定运行的是openssl命令。其它命令是完全一致的。
(5)、生成用户公钥及网页填充
1、生成公钥
同样对于windows用户而言,直接在openssl.exe中输入下面的命令:
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
同样,如果是Mac的同学,输入的命令应该是如下:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
得到生成成功的结果,如下图:
此时,我们可以在bin文件夹中看到一个文件名为rsa_public_key.pem的文件,用记事本方式打开它,可以看到-----BEGIN PUBLIC KEY-----开头,
-----END PUBLIC KEY-----结尾的没有换行的字符串,这个就是公钥。
在生成网页以后,复制----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----之间的部分,即那段纯代码,不要把----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----给复制进去了。中间的这部分就是公钥。
2、网页填充
然后到https://openhome.alipay.com/platform/keyManage.htm?keyType=partner(需要登录)中,左侧找到合作伙伴密钥栏,再到右侧的RSA加密中,将公钥粘贴进去。由于,我们已经粘贴进去了,所以这里显示查看开发者公钥,在没填之前写的是“添加开发者公钥”
到这里,所有的准备工作都已经结束了。下面就是配置DEMO的过程了
3、配置DEMO
在刚才下载的sdk&demo的源码中,打开DEMO/客户端demo/支付宝Android 15.0.1/alipay_demo工程
路径如下:
在PayDemoActivity中配置几个变量:
//PID
public static final String PARTNER = "";
在这里填上我们上面找到的PID;
// 商户收款账号
public static final String SELLER = "76949XXXX@qq.com";
然后在SELLER上写上我们支付宝的登录帐户,即那个你申请移动支付的支付宝账号
// 支付宝公钥
public static final String RSA_PUBLIC ="";
然后在RSA_PUBLIC这里填上支付宝公钥
// 商户私钥,pkcs8格式
public static final String RSA_PRIVATE = "";
最后是填上RSA_PRIVATE对应的商户私钥,注意是PKCS8格式的。
私钥这部分,注意是----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----之间的部分,即那段纯代码,不要把----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----给复制进去了。中间的这部分就是公钥。
现在运行demo就直接可以支付了。
本文中对应的DEMO在文章底部给出。
4、代码讲解
通过上面的配置,demo应该就直接可以运行了,但这里所涉及的代码,我们再仔细看看
主要的支付与结果返回就是pay()这个函数,这里完成了支付所需要的所有功能。代码如下:
public void pay(View v) {
…………
// 订单信息
String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");
// 对订单做RSA 签名
String sign = sign(orderInfo);
try {
// 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
+ getSignType();
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(PayDemoActivity.this);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
这里总是分了四步来完成支付与结果接收。
第一步:构造定单信息:
String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");
主要是这句,即在getOrderInfo()函数中完成定单信息的构造:(这里对getOrderInfo函数做的精减,更多字段及意义参考源码)
有关paymethod的方法使用,参考:https://cshall.alipay.com/support/help_detail.htm?help_id=476935
各个字段的意义及取值参考:http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103663&docType=1
public String getOrderInfo(String subject, String body, String price) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + PARTNER + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + SELLER + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 服务器异步通知页面路径
orderInfo += "¬ify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
+ "\"";
…………
return orderInfo;
}
这里就是通过我们的提供的商家ID,产品信息,价格等信息来构造定单及回调页面,这里需要非常注意的一个地方:
// 服务器异步通知页面路径
orderInfo += "&noify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
+ "\"";
服务器异步通知页面路径,首先我们用支付宝支付之后,支付宝会返回给我们两个通知,一个是同步的,就是我们点击支付后支付宝直接反馈给我们客户端的信息,我们可以直接拿到,根据反馈的结果可以初步判定该次交易是否成功,第二个就是服务器异步的通知,这个异步的通知是支付宝的服务器端发给我们服务器端的信息,我们在客户端是直接获取不了的,那支付宝的服务器怎么知道我们服务器的路径呢,那就是这参数的作用了,我们给支付宝服务器一个路径,它就会在订单状态改变的时候给我们服务器端一个反馈,告诉服务器这次交易的状态,如果服务器结果判定该次交易成功了,就必须返给支付宝服务器一个success,要不服务器会一直给我们异步通知,因为它不知道该次交易是否完成了(一般情况下25小时内8次通知,频率一般是2m 10m 10m 1h 2h 6h 15h),我们一般会在收到异步通知时,对订单的状态进行更新。
其它的就不讲了,通过看源码都能看得懂,比如构造订单号啥的。
第二步:对订单字符串做RSA签名
为什么要签名呢?当然是防止传输出错了,这可是跟钱相关的,如果orderInfo传输过程中出错了,那怎么样来校验它是不是出错了呢,只有通过签名算法来了。所以这里就需要对订单字符串做签名。
具体签名算法就不讲了,直接应用到项目中就行,不需要理解,如果想看看怎么实现的,里面有对应的源码,可以去研究一下。
// 对订单做RSA 签名
String sign = sign(orderInfo);
try {
// 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
第三步:构造完成的请求字符串
在订单字符串和签名做完以后,就可以用他们来构造完整的请求字符串了:
// 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
+ getSignType();
第四步:请求与结果返回
最后是发送请求,代码如下:
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(PayDemoActivity.this);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
最关键的部分在这里:
PayTask alipay = new PayTask(PayDemoActivity.this);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
在String result = alipay.pay(payInfo);中,就直接获得了支付结果;
然后通过handler将结果发送出去。
这就是同步的方式获取支付结果的方式。
android 支付宝第三方支付相关推荐
- 浅谈支付宝第三方支付
技术点(九):支付宝第三方支付 1)下载demo地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.aWu6YY& ...
- Android常用第三方支付
移动支付 用户使用移动的终端完成对所购买商品或者服务的支付功能;分为近场支付(蓝牙支付,刷卡,滴卡),和远程支付(网上支付,短信支付) app支付模块 常见的支付厂商-->常见的支付方式 ...
- 7.Android常用第三方支付
移动支付 用户使用移动的终端完成对所购买商品或者服务的支付功能;分为近场支付(蓝牙支付,刷卡,滴卡),和远程支付(网上支付,短信支付) app支付模块 常见的支付厂商-->常见的支付方式 支付宝 ...
- Android开发第三方支付微信支付实例集成过程介绍
最近开发的项目需要集成第三方微信支付,于是查看了微信开放平台的开发指南顺利完成,下面为大家分享一下. 一.在集成之前先到微信开放平台拿到以下三个参数: 项目APP ID, 商户平台的商户号MCH_ID ...
- android支付宝接入支付问题ali40247
前言:继续来研究支付宝接入时候遇到的问题. 问题截图: 解决方案: 这里给大家一个详细分析的链接,可以看这里详细了解支付宝ali40247解决方案 听我说: 1.首先你需要确定的是你接入使用的是sdk ...
- android微信第三方支付,Android第三方sdk加入App微信支付解决方案
问题引入 Android的微信支付申请的时候需要应用的包名和应用签名,如果开发过程中这两项和申请的不一致,是调不起来微信支付的.对于一般的应用来说,包名和签名比较好解决,因为一个应用就是一个签名和一个 ...
- Django框架实现支付宝第三方支付
下面是针对使用Django框架项目接入第三方支付宝支付的相关链接: 支付宝开发平台登录: https://open.alipay.com/platform/home.htm 沙箱环境: 沙箱应用:ht ...
- Android 支付宝 移动支付接口 快速配置
RSA签名 RSA密钥生成命令 生成RSA私钥 openssl>genrsa -out rsa_private_key.pem 1024 生成RSA公钥 openssl>rsa -in r ...
- java支付宝第三方支付详解
1.引入支付宝sdk文件. <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipa ...
- 支付宝第三方支付接口java调用详细文档
进入蚂蚁金服开放者平台 登录 - 支付宝 下载demo 修改文件 App_id Merchant_private_key Alipay_public_key 修改网关 注意,这边是在沙箱模式下,如果真 ...
最新文章
- 38.6. Web IRC
- mysql 范围内日期列表,mysql – 将日期列表条件中的日期转换为日期范围列表
- 为什么在用Vivado生成存储器配置文件时找不到相应型号的Flash芯片呢?
- 怎样给RCP程序添加依赖的JAR包
- Hadoop的数据管理
- linux sudo命令全称,linux sudo命令的概念与使用
- delphi语言转为汇编语言_每天5分钟,轻松建立技术图谱 编程语言黑历史
- 直接在线查看github里的jupyter notebook
- google java. 集合_google guava集合之Table
- Nginx 静态服务器
- 阿里云国际站代理商:SCDN的抗CC攻击和抗DDoS攻击防护是什么?
- 计算机解码原理图,diy制作改进的CS4398解码 DAC PCB和原理图纸
- mysql查询条件忽略大小写_mysql 查询条件不区分大小写问题
- foxmail收取服务器邮件次数,Foxmail:如何设置收取历史邮件?
- 一个过不了情关的男人!!
- Censored! POJ - 1625(AC自动机 + dp +高精度模板)
- 工业物联网创新方案亮相2018云栖大会
- 【Selenium】控制当前已经打开的 chrome浏览器窗口
- 南卡、ikf蓝牙耳机怎么样?南卡、ikf两款国产高性价比蓝牙耳机对比评测
- 各种艺术字、图片在线制作
热门文章
- 简要介绍随机森林原理
- 利用 LotusScript 实现 Microsoft Word 文档在公文流转中的公文留痕
- hpsocket错误码对照表
- vscode vim插件(updating)
- Type-C接口技术(一)
- M-TOUCH移动端社区论坛类型的网站源码
- 如何在matlab坐标轴上输入希腊字符和开根号符号
- Xilinx Petalinux安装和使用
- hadoop原理示意图
- 解决:卸载软件,看我就够了!“启动C:\\Program时出现问题,找不到指定的模块“