android 支付宝第三方支付

article/2025/10/2 8:58:57

支付宝集成文档

一、申请移动支付权限

首先登录【支付宝开放平台】http://open.alipay.com/platform/home.htm,添加应用,申请移动支付权限。申请开通支付,是需要公司文件的,个人是不允许开始支付的。

二、阿里支付DEMO

自己去下载

2、配置几个变量

这部分会对代码中用到的几个变量的找到方法或生成方法进行讲述,部分资料引自支付宝开放平台。

(1)PID

合作者身份IDPID)是商户与支付宝签约后,商户获得的支付宝商户唯一识别码。当商户把支付宝功能接入商户网站时会用到PID,以便让支付宝认证商户。
查看PID步骤如下:
1、登录支付宝官方网站b.alipay.com
2、点击导航栏中商家服务

 

3、点击查询PIDKey”

 

(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 KEYEND 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将结果发送出去。
这就是同步的方式获取支付结果的方式。

 


http://chatgpt.dhexx.cn/article/N9LsBWkO.shtml

相关文章

第三方支付系统如何测试?案例分析

一、背景 近年来,随着互联网应用服务的发展、尤其是电子商务的勃兴,我国的第三方支付产业进入了爆炸式增长时期。目前,第三方支付企业的年交易总额已突破万亿元,在人民银行备案的第三方支付企业数量已达260多家。第三方支付以其方…

第三方支付接口设计

你是个干大事的人 前言安全性稳定性事务一致性可维护性 前言 阅读本文大概需要6分钟 ​最近在项目中对接了第三方支付,对于第三方支付来说,比较复杂功能的就是支付、退款、对账。 本篇文章我们只介绍支付相关的接口设计。 一笔支付流水可能涉及到的节点…

第三方支付接口怎么测试

现在有不少测试朋友做的项目中,可能也会涉及到支付相关的功能。比如:做商城的,做游戏的以及其他在线交易的网站、APP等。如果支付出了问题,或者用户拿少的钱通过篡改请求数据购买大金额的商品,如果是实物的话&#xff…

java支付系统,三方支付系统,四方支付系统

背景介绍 之前使用的是外面的四方系统,不方便服务商批量提供和管理收款账号;所以想着自己写一套,技术使用的都是新技术 前后分离,前端使用vue,后端使用springcloud-alibabaspringboot微服务架构。现在系统可以投入使用…

php第三方支付系统--支付流程--及代码

目前来说,越来越多的行业互联网化,也掀起了互联网金融的浪潮,第三方支付的开发也越来越广泛,一般大型的第三方支付系统包括,前置系统,支付系统,渠道系统,账务系统,清结算系统,运营与维护管理平台。下面我们来了解一下常见的一些支付流程,让大家了解了解 快捷支付流…

涉及第三方支付接口,怎么测?

大家好啊,我是大田。 像一些做金融项目、电商项目等有支付功能的系统,基本都会调用第三方支付接口,那我们应该如何测试?这里谈谈大田的思路,仅供参考: 1、根据流程图,深刻理解我司与第三方系统都…

第三方支付流程

目前来说,越来越多的行业互联网化,也掀起了互联网金融的浪潮,第三方支付的开发也越来越广泛,一般大型的第三方支付系统包括,前置系统,支付系统,渠道系统,账务系统,清结算…

第三方支付原理

1.什么是第三方支付 所谓第三方支付,就是一些和各大银行签约、并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖…

支付宝第三方登录

支付宝登录 最近做了第三方登录,看了官方文档,加上各种百度,依然踩过不少坑,今天和大家分享一下。 我是做的pc端的,贴张图。 首先: 有支付宝的实名账号,没有实名实名一下。然后选择合作伙伴角色…

第三方支付简要原理解释说明

第三方支付,就是一些具备实力和信誉保障的第三方独立机构提供的交易支付平台。买方选购了商品后,使用第三方平台进行付款,由第三方通知卖家货款到达。 目前市面上支持第三方支付的平台有很多,商家通过和第三方签署协议&#xff0…

如何高效对接第三方支付

简介 电商购物流程中核心的一环是用户支付。目前我们已经服务30个国家和地区,不同国家往往需要对接不同的第三方支付公司,所以最近两年,研发组对接了大量的第三方支付公司,积累了一定的经验。 本文主要分享如何对接第三方支付&a…

第三方支付

1. 第三方支付 概念: 第三方支付,就是通过与产品所在国家以及国外各大银行签约、由具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支…

第三方支付系统--支付流程

目前来说,越来越多的行业互联网化,也掀起了互联网金融的浪潮,第三方支付的开发也越来越广泛,一般大型的第三方支付系统包括,前置系统,支付系统,渠道系统,账务系统,清结算…

作为测试,你了解第三方支付吗?

在很多平台都是调用第三方支付平台,比如支付宝,微信,银联电子支付等。你是否真的了解第三方支付呢? 大家每天在使用支付宝时,是不是感觉很蛮简单的?不外乎就是绑个卡,验一下支付密码&#xff0c…

程序员如何挣外快

挣钱的方式有很多,今天讲的是我觉得比较适合程序员的方法,如果渴望一夜暴富的,可以不用往下看了,因为这种简单粗暴的方法可能有,但是我并不知道,就算知道了也不会到处跟人说。在我看来,对于程序…

php初级程序员,接单,挣外快的指导方法

本文只是适合入门一段时间的php初级程序员哟,大佬就可以忽略不计。 我当时大二,学习php一个月,就尝试网上第一次接单了,也算是运气不错,当时接了几个女生的课堂设计,刚好她们就不需要太多的美观&#xff0c…

程序员如何挣外快?

当程序员是一件很棒的事情。不仅很有趣,还有大量的工作机会,其中多数工作的薪资都很高。 但有时候,你仍想去赚一些外快。可能是因为仍在上大学,可能是想为自己而非他人工作,或者想用更多的时间陪伴孩子。你仍需要赚更多的钱,或者仅仅是兴趣使然。好消息是:作为程序员,…

程序员挣外快指南

作为一名程序员,在上班之余,我们有大把的时间,不能浪费,这些时间其实都是可以用来挖掘自己潜在的创造力,今天要讨论的话题就是,程序员如何利用空余时间挣零花钱?比如说周末可以赚外快啊&#xf…

程序员赚外快的方式

更多文章详情–>码帮帮 前言 IT这个行业,就是个围城,里面都想逃离,外面的人千方百计想进来,外面的人想进来无非就是看中我们这个行业的工资高罢了,里面的人想出去,无非就是工作压力大,技术…

怎么通过python挣外快_我是如何通过python挣外快的

之前写过《在校大学生如何用知识月入3000》,是文字版的,昨天趁着去KFC吃饭这件事引起了我话痨模式(录制了视频上传到B站),重新谈谈兼职赚钱这个事情。 我为啥要去吃KFC? 根本原因 我是风险规避型人格&…