Delphi XE7 Android

应用接入支付宝SDK的方法

1      应用场景和准备工作:

  1. 采用XE系列开发的android apps。
  2. apps中需要集成支付宝的支付能力。
  3. 支付到指定的商家(一般就是软件开发商自己啦),商家需要事先在支付宝的开放平台申请开通【支付宝无线快捷支付】,具体请百度。
  4. 开通【无线快捷支付】后,支付宝应该返回给商家如下几个重要参数:

PARTNER(商户ID): 一个16为的字符串,应该都是数字。

SELLER(商户名):多数是商户的邮件地址。

RSA_PRIVATE(商户私钥 ): 一个848位的字符串,采用pkcs8编码过。

RSA_PRIVATE(商户私钥 ): 一个848位的字符串。

RSA_PUBLIC(商户公钥):一个218位的经过pkcs8编码的字符串。这个公钥并没有用到,是支付宝后台用的。

  1. 5.         以上几个参数,都是支付宝再审核通过后,通过邮件发送给商家的,其中RSA的两个公私钥,需要商户自己根据手册自行生成并上传和保存,具体这一步请务必参考支付宝开放平台的说明。

2      XE7中的开发准备工作:

  1. 下载一个java2op.exe,备用。
  2. 建立一个android的应用。
  3. copy支付宝sdk的三个jar包到工程目录(最好和你的pas文件一个目录,最好也把java2op这个文件copy到这里。
  4. 在IDE右边的ProjectManager中,添加支付宝SDK(android)的三个jar包,如右图。细心的朋友可能发现多了一个jar包:signutils.jar,这个不是支付宝(alipay)sdk带的,是我自己加上的,用途我们稍后再说。
  5. 打开一个CMD命令行窗口。
  6. 从命令行里,CD到你的工程目录,有jar包的地方,执行如下命令:

i.              java2op -jar alipaysdk.jar -unit alipaysdk

ii.              java2op -jar alipaysecsdk.jar -unit alipaysecsdk

iii.              javs2op -jar alipayutdid.jar -unit alipayutdid

  1. 如果一切顺利,在当前目录应该发现新增的这三个pas文件。如图:

3      XE7中的代码工作:

  1. 请按照支付宝SDK的要求,在androidmanifest.template.xml文件总,增加sdk中的activity的引用,如图:
  2. 具体这个xml在什么位置,以及这个activity的字符串从何处得来,我就不费力解释了,相信大家都知道。
  3. 在支付宝SDK的接入手册中,针对混淆部分的要求,可以忽略,不用关心。
  4. 在适当的pas文件中,增加对之前生成的三个pas的引用(附带几个要用到的单元,也一并加上吧),如图:
  5. 注意:在编译的时候,这三个pas文件,会报错,几乎都是某个"property a"重复定义的问题,请直接手动把每个报错的‘a’都改为‘aaaaa’,随便什么即可,删除也行。
  6. 开始加入最关键的代码,例如我们要在一个按钮下开始支付,支付的商品名称、描述和价格,我们可以用三个edit来作为测试输入,这里就不截图描述了,过程如下:

iv.

 
   

在pas某个位置,声明三个常量或者属性备用,这三个属性就是之前支付宝返回的参数。

v.             
在所谓的【支付按钮】的事件里,写如下代码:

procedure
TForm3.Button1Click(Sender: TObject);

var

PayTask: JPayTask;

PayClass: JPayTaskClass;

JOrderInfo: JString;

OrderInfo,Sign: String;

begin

PayClass := TJPayTask.JavaClass;

PayTask := PayClass.init(MainActivity);

OrderInfo := Self.getOrderInfo('abcd','body','0.01');

sign := Self.Sign(OrderInfo);

OrderInfo := OrderInfo +
'&sign="'+sign+'"';

OrderInfo := OrderInfo +
'&sign_type="RSA"';

Self.Memo1.Lines.Text := OrderInfo;  //调试用,你懂的。

JOrderInfo := StringToJString(OrderInfo);

PayTask.pay(JOrderInfo);

end;

vi.             
getOrderInfo: 这个函数文档后面会有,是按照支付宝的要求,对订单信息进行格式化处理的,这个函数中调用了一个getTradeNo,是自定义的,也就是生成订单号的,保证不重复即可,随便写。

vii.             
Sign函数:这个函数就用到了之前在前面看到的signutils.jar这个包,原本支付宝的sdk是没有这包的,这个包是我自己用java编写并加入到项目中的,原因就是:支付宝sdk要求,需要对订单信息进行rsa签名,这个签名过程比较复杂,熟悉java的,可以下载java的demo来看一下,我尝试用delphi下的一些工具和第三方组件,但都失败了,可能是我还不是很熟悉吧,我就把java中的函数封装到这个jar中,供delphi来调用,很好用,文档的后面也会有这个函数的代码,但具体今后每个开发者用什么方法来给订单做sign的签名,只能大家各自想办法了。文档中,我会链接这个jar给大家。

viii.             
如果一切正常,应该可以看到支付宝的界面了,至于调试过程中出现的各种错误,只能百度。

ix.             
系统繁忙,请稍后重试:ALI64: 这个错误几乎都是订单信息格式不对,或者支付宝返回的各种参数没有用对,还有可能是没有开通无线快捷支付。

x.             
系统繁忙,请稍后重试:ALI10:这个错误主要是sign签名不对。

  1. 附录代码:

function TForm3.getOrderInfo(subject,
body, price: string): string;

var

s: string;

begin

//
签约合作者身份ID

s
:= 'partner="' + PARTNER + '"';

//
签约卖家支付宝账号

s
:= s + '&seller_id="' + SELLER + '"';

//
商户网站唯一订单号

s
:= s+ '&out_trade_no="' + getOutTradeNo + '"';

// 商品名称

s
:= s + '&subject="' + subject + '"';

//
商品详情

s
:= s + '&body="' + body + '"';

//
商品金额

s
:= s + '&total_fee="' + price + '"';

//
服务器异步通知页面路径

s
:= s + '&notify_url="' + 'http://你的业务后台地址,一定要写,要合法"';

//
服务接口名称,
固定值

s
:= s + '&service="mobile.securitypay.pay"';

//
支付类型, 固定值

s
:= s + '&payment_type="1"';

//
参数编码, 固定值

s
:= s + '&_input_charset="utf-8"';

//
设置未付款交易的超时时间

//
默认30分钟,一旦超时,该笔交易就会自动被关闭。

//
取值范围:1m~15d。

//
m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。

//
该参数数值不接受小数点,如1.5h,可转换为90m。

s
:= s + '&it_b_pay="30m"';

//
extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付

//
orderInfo += "&extern_token=" + "\"" +
extern_token + "\"";

//
支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空

s
:= s + '&return_url="m.alipay.com"';

//
调用银行卡支付,需配置此参数,参与签名,
固定值 (需要签约《无线银行卡快捷支付》才能使用)

//
orderInfo += "&paymethod=\"expressGateway\"";

Result := s;

end;

function TForm3.getOutTradeNo: string;

var

G: TGuid;

S: string;

begin

G
:= TGuid.NewGuid;

S
:= G.ToString;

S
:= S.Substring(0,15);

Result := 'abcdefghijklmn';

end;

function TForm3.Sign(const Orders:
string): string;

var

SignClass: JSignUtilsClass;

Js,jpri: JString;

begin

Result := '';

try

Js := StringToJString(Orders);

JPri := StringToJString(RSA_PRIVATE);

SignClass := TJSignUtils.JavaClass;

SignClass.init;

js := SignClass.sign(js,jpri);

//js := SignClass.DoURLEncode(js);

Result := JStringToString(js);

finally

end;

其他:

4     
真实业务场景的考虑

按照支付宝或者微信支付的开发手册的说法,一个标准的客户端接入支付业务模型应该是这样的,我忽略时序图,只用文字描述:

  1. 用户登录客户端,选择商品,然后点击客户端支付。
  2. 客户端收集商品信息,然后调用自己业务平台的预付款接口。
  3. 业务平台根据客户端提交的商品信息,生成自己的订单号等内容,并按照第三方支付的要求对订单信息进行拼装组合,并编码和签名。
  4. 业务平台返回签名后的订单信息给客户端。
  5. 客户端根据这个签名信息,呼出客户端的第三方支付系统,完成支付。

DELPHI移动端支付宝支付的更多相关文章

  1. 电脑端支付宝支付 -前端获取支付宝返回的form 以及submit 调用支付扫码页面

    前端调取支付宝支付接口(后台进行封装,没有直接调取支付宝接口),调用返回的数据中,将会有一串的form表单数据返回,我们需要将此表单在当前调用页面submit下,以跳转到支付扫码页: 支付宝返回的fo ...

  2. PHP服务端支付宝支付及回调

    支付宝支付 (由app端自行调起支付宝/微信) 1.下载PHP版SDK 1 <?php 2 3 define('IN_ECS', true); 4 5 /*App支付 PHP服务端*/ 6 /* ...

  3. PHP APP端支付宝支付

    应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步: 1.在 ...

  4. 微信端支付宝支付,iframe改造,解决微信中无法使用支付宝付款和弹出“长按地址在浏览器中打开”

    微信对支付宝的链接屏蔽了, https://mapi.alipay.com/gateway.do?_input_charset=utf-8&notify_url=http%3A%2F%2Fzh ...

  5. ecshop移动端支付宝支付对接

    初始页,提交基本信息到api页面, <?php /* * * 功能:支付宝手机网站支付接口接口调试入口页面 * 版本:3.4 * 修改日期:2016-03-08 * 说明: * 以下代码只是为了 ...

  6. PHP PC端支付宝扫码支付

    前面的文章已经描述过在蚂蚁金服开放平台创建应用签约等流程,详见:PHP App端支付宝支付,这里就不多说了,剩下的分两步,第一步是支付前的准备工作,也就是整合支付类文件,我已经整合好可以直接用,代码开 ...

  7. 支付宝支付功能(使用支付宝sdk)

    1.准备参数        新建一个公共参数配置类NewAlipayconfig (可将参数存放到config配置文件中读取)          public class NewAlipayconfi ...

  8. 【zhifu】web开发中的支付宝支付和微信支付

    一.支付类型: 支付宝支付: 支付宝app内的网页支付: app外(即普通浏览器)网页支付: 微信支付: 微信app内的支付(在这里叫公众号支付) app外的支付(微信H5支付): 微信公众号的支付宝 ...

  9. DELPHI支付宝支付代码

    真实业务场景的考虑 按照支付宝或者微信支付的开发手册的说法,一个标准的客户端接入支付业务模型应该是这样的,我忽略时序图,只用文字描述: 用户登录客户端,选择商品,然后点击客户端支付. 客户端收集商品信 ...

随机推荐

  1. 解决标准FPGA资源丰富却浪费的问题

    FPGA以计算速度快.资源丰富.可编程著称,之前一直应用于高速数字信号领域和ASIC验证.随着逻辑资源的丰富和编程工具的改进,FPGA在机器学习和硬件加速上得到越来越多的重视,目前数据中心已经大量采用 ...

  2. mysql-Innodb事务隔离级别-repeatable read详解(转)

    一.事务隔离级别 ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串 ...

  3. Regenerate Script 重置脚本

    1.Regenerate Script 重置回录制后的第一次脚本,当修改设定后点击这个按钮,新的设置也会录制到 如:开始没有录到下载的文件,添加下载文件的个时候,再次点击重置,就录制到了 如:如开始是 ...

  4. 030:Cetus中间件和MHA读写分离

    030:Cetus中间件和MHA读写分离 line:V1.1 mail: gczheng@139.com date: 2018-08-30 一.主机环境 虚拟机配置 CPU 内存 硬盘 OS版本 My ...

  5. 5月24日上课笔记-js操作DOM

    解析properpties配置文件 类加载器 ResourceBundle 一.jquery操作DOM 1.jquery操作css css("",""); cs ...

  6. 在SUSE Linux Enterprise 11 SP1上用UDEV SCSI配置ASM

    1. 编辑/etc/scsi_id.config文件,如果该文件不存在,则创建该文件,添加如下行: options=–whitelisted –replace-whitespace 2. 获取需要绑定 ...

  7. python之解析json

    json的格式是一个无序的键值对的集合,对象以{}包含,键值中间用:隔开,两个键值对之间用,隔开,值可以是双引号引起来的字符串(string),数值(number),true,false,null,对 ...

  8. sed你所不知道的语法

    测试内容

  9. 225. Implement Stack using Queues + 232. Implement Queue using Stacks

    ▶ 栈和队列的相互表示.发现内置的队列和栈结构都十分高效,相互表示后性能损失都很小. ▶ 第 225 题,用队列实现栈 ● 自己的代码,3 ms,单队列实现,入栈 O(1),读取栈顶元素 O(n),出 ...

  10. YUM CentOS 7 64位下mysql5.7安装配置

    配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ #下载mysql源安装包 # wget http://dev ...