介绍

参考安卓Dialog源码,他的builder设计模式实现方式是,使用内部类来实现功能,外部类的作用是通过build()函数,来对内部类进行参数设置,例如setter方法。

Buidler设计模式它一般用于用户不知道内部构建细节的情况下更加精细地控制对象构建流程,例如安卓系统的AlertDialog类,它包括了icon、title、msg、button1、button2等,这些装配的部分是比较多的,代码实现过程也较为漫长。使用Builder模式,可以使得这些调用变得简单,在构建过程各个部件可以自由扩展,以及重新设置参数。

支付宝支付

首先集成支付宝SDK

下载地址:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1

下载完成后,把压缩包解压,在下图的路径下找到这个jar文件,并把它引入到项目中。

然后把demo中的三个java文件复制到项目中,它们是:Base64.java、PayResult.java、SignUtils.java。

开始写AliPay这个类

笔者参考AlerDialog的类源码,对支付宝支付的过程进行一个Builder设计模式封装。你可以支付复制拿去用,立刻完成支付功能。其AliPay.java代码如下:

public class AliPay {public static class Builder {private Activity mActivity;public Builder(Activity activity) {this.mActivity = activity;}/*** 设置商户PID*/private String PARTNER = "";// 商户收款账号private String SELLER = "";// 商户私钥,pkcs8格式private String RSA_PRIVATE = "";// 支付宝公钥private String RSA_PUBLIC = "";private int SDK_PAY_FLAG = 6406;private String orderTitle = "";private String subTitle = "";private String price = "";private String notifyURL = "";/*** 设置商户PID*/public AliPay.Builder setPARTNER(String PARTNER) {this.PARTNER = PARTNER;return this;}/*** 设置商户收款账号*/public AliPay.Builder setSELLER(String SELLER) {this.SELLER = SELLER;return this;}/*** 设置商户私钥,pkcs8格式*/public AliPay.Builder setRSA_PRIVATE(String RSA_PRIVATE) {this.RSA_PRIVATE = RSA_PRIVATE;return this;}/*** 设置支付宝公钥*/public AliPay.Builder setRSA_PUBLIC(String RSA_PUBLIC) {this.RSA_PUBLIC = RSA_PUBLIC;return this;}/*** 设置商品名称*/public AliPay.Builder setOrderTitle(String orderTitle) {this.orderTitle = orderTitle;return this;}/*** 设置商品详情*/public AliPay.Builder setSubTitle(String subTitle) {this.subTitle = subTitle;return this;}/*** 设置商品价格*/public AliPay.Builder setPrice(String price) {this.price = price;return this;}/*** 设置支付宝支付成功后通知的地址,可以填写你公司的地址*/public AliPay.Builder setNotifyURL(String notifyURL) {this.notifyURL = notifyURL;return this;}@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {@SuppressWarnings("unused")public void handleMessage(Message msg) {switch (msg.what) {case 6406: {PayResult payResult = new PayResult((String) msg.obj);/*** 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&* docType=1) 建议商户依赖异步通知*/String resultInfo = payResult.getResult();// 同步返回需要验证的信息String resultStatus = payResult.getResultStatus();// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档if (TextUtils.equals(resultStatus, "9000")) {if (mPayCallBackListener != null) {mPayCallBackListener.onPayCallBack(9000, "9000", "支付成功");}} else {// 判断resultStatus 为非"9000"则代表可能支付失败// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)if (TextUtils.equals(resultStatus, "8000")) {if (mPayCallBackListener != null) {mPayCallBackListener.onPayCallBack(8000, "8000", "支付结果确认中");}} else {// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误if (mPayCallBackListener != null) {mPayCallBackListener.onPayCallBack(0, "0", "支付失败");}}}break;}default:break;}}};public void pay() {if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {new AlertDialog.Builder(mActivity).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialoginterface, int i) {//mActivity.finish();}}).show();return;}String orderInfo = getOrderInfo(orderTitle, subTitle, price, notifyURL);/*** 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!*/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() {@Overridepublic void run() {// 构造PayTask 对象PayTask alipay = new PayTask(mActivity);// 调用支付接口,获取支付结果String result = alipay.pay(payInfo, true);Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();}public void setPayCallBackListener(PayCallBackListener listener) {this.mPayCallBackListener = listener;}private PayCallBackListener mPayCallBackListener;public interface PayCallBackListener {void onPayCallBack(int status, String resultStatus, String progress);}/*** 创建订单信息*/private String getOrderInfo(String subject, String body, String price, String notifyURL) {// 签约合作者身份IDString orderInfo = "partner=" + "\"" + PARTNER + "\"";// 签约卖家支付宝账号orderInfo += "&seller_id=" + "\"" + SELLER + "\"";// 商户网站唯一订单号orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";// 商品名称orderInfo += "&subject=" + "\"" + subject + "\"";// 商品详情orderInfo += "&body=" + "\"" + body + "\"";// 商品金额orderInfo += "&total_fee=" + "\"" + price + "\"";// 服务器异步通知页面路径orderInfo += "&notify_url=" + "\"" + notifyURL + "\"";// 服务接口名称, 固定值orderInfo += "&service=\"mobile.securitypay.pay\"";// 支付类型, 固定值orderInfo += "&payment_type=\"1\"";// 参数编码, 固定值orderInfo += "&_input_charset=\"utf-8\"";// 设置未付款交易的超时时间// 默认30分钟,一旦超时,该笔交易就会自动被关闭。// 取值范围:1m~15d。// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。// 该参数数值不接受小数点,如1.5h,可转换为90m。orderInfo += "&it_b_pay=\"30m\"";// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空orderInfo += "&return_url=\"m.alipay.com\"";// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)// orderInfo += "&paymethod=\"expressGateway\"";return orderInfo;}/*** 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)*/private String getOutTradeNo() {SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());Date date = new Date();String key = format.format(date);Random r = new Random();key = key + r.nextInt();key = key.substring(0, 15);return key;}/*** sign the order info. 对订单信息进行签名** @param content 待签名订单信息*/private String sign(String content) {return SignUtils.sign(content, RSA_PRIVATE);}/*** 获取签名方式*/private String getSignType() {return "sign_type=\"RSA\"";}}// 商户PIDprivate String PARTNER="";// 商户收款账号private String SELLER="";// 商户私钥,pkcs8格式private String RSA_PRIVATE="";// 支付宝公钥private String RSA_PUBLIC="";private String orderTitle="";private String subTitle="";private String price="";private String notifyURL="";private Builder payData;public Builder build(Activity activity) {payData = new Builder(activity);payData.setPARTNER(PARTNER);payData.setSELLER(SELLER);payData.setRSA_PRIVATE(RSA_PRIVATE);payData.setRSA_PUBLIC(RSA_PUBLIC);payData.setOrderTitle(orderTitle);payData.setSubTitle(subTitle);payData.setPrice(price);payData.setNotifyURL(notifyURL);return payData;}public AliPay setPARTNER(String PARTNER) {this.PARTNER = PARTNER;return this;}public AliPay setSELLER(String SELLER) {this.SELLER = SELLER;return this;}public AliPay setRSA_PRIVATE(String RSA_PRIVATE) {this.RSA_PRIVATE = RSA_PRIVATE;return this;}public AliPay setRSA_PUBLIC(String RSA_PUBLIC) {this.RSA_PUBLIC = RSA_PUBLIC;return this;}public AliPay setOrderTitle(String orderTitle) {this.orderTitle = orderTitle;return this;}public AliPay setSubTitle(String subTitle) {this.subTitle = subTitle;return this;}public AliPay setPrice(String price) {this.price = price;return this;}public AliPay setNotifyURL(String notifyURL) {this.notifyURL = notifyURL;return this;}public void pay() {if (payData != null) {payData.pay();}}
}

调用方式

它会有一个回调状态处理,调用setPayCallBackListener即可得到。

补充点:

权限配置

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

AndroidManifest.xml(你可以直接复制下面的)

<activityandroid:name="com.alipay.sdk.app.H5PayActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind">
</activity>
<activityandroid:name="com.alipay.sdk.auth.AuthActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind">
</activity>

私钥、公钥

私钥或公钥的生成,支付宝已经在demo文件夹中提供了工具。

RSA密钥生成命令

生成RSA私钥

genrsa -out rsa_private_key.pem 1024

生成RSA公钥

openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

将RSA私钥转换成PKCS8格式

openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

然后,将生成的公钥上传到支付宝商户账户中,具体文档在下面连接中:
https://doc.open.alipay.com/doc2/detail.htm?treeId=58&articleId=103578&docType=1

将私钥PKCS8格式保存在代码中,

支付页面:

到这里你已经可以完成支付宝支付功能,很简单吧。笔者继续研究微信支付…

安卓Android轻松完成支付宝支付教程相关推荐

  1. 安卓-Android如何集成支付宝支付(集成阿里支付)详解。Android接入alipay支付

    支付宝支付官网地址: 打开官网 服务器端如何拼接Orderinfo所需参数请看这篇文章.打开链接 安卓app集成阿里支付流程: 步骤一:下载aar和demo,并将aar添加到安卓项目依赖里.点击查看如 ...

  2. Android端集成支付宝支付

    Android端集成支付宝支付 1.申请账号及配置变量 支付宝快速接入链接点击打开链接 支付宝扫码或者账号密码登录 下面是支付宝给出的接入介绍 第一步:创建应用并获取APPID 要在您的应用中接入支付 ...

  3. php yii2支付宝开发,yii2 支付宝支付教程 [ 2.0 版本 ]

    yii2 支付宝支付教程 [ 2.0 版本 ] 支付宝支付流程个人理解大致就这三步 1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层 2.在订单处理层引用支付宝的接口 将支付数据写 ...

  4. Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记

    Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记 中间遇到各种问题导致最终没法看到抓包信息,一个坑一个坑的埋,终于成功抓包小程序. 梳理了下可以尽量减少栽坑的安装过程,如 ...

  5. Java接入支付宝支付教程

    Java接入支付宝支付教程 一.创建应用 1.登录支付宝开放平台 支付宝开放平台网址:https://open.alipay.com/platform/developerIndex.htm 2.创建一 ...

  6. Android应用接入支付宝支付详细教程

    第一步:访问支付宝开放平台,进入管理中心 支付宝开放平台 (alipay.com)https://open.alipay.com/ 第二步: 创建应用 客户端应用信息如何配置(Android端) - ...

  7. android监听支付宝支付成功,Andriod监听支付宝收款实现个人支付宝支付接口!附安卓App...

    个人微信支付宝免签约支付解决方案 首先呢,我不会开发安卓App,这款APP是我在酷安网看到的,非常简单的一款APP,安装后填写我们的后端接口(用于接收收款通知的)就可以接收收款通知了.所以就算我们没有 ...

  8. Android之封装支付宝支付

    在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装. 封装的代码也很简单,就是将官网给的demo提取出一个类来方便使用. /*** 支 ...

  9. Android app集成支付宝支付

    支付宝支付 其实是比较简单的,但因为发起订单总是失败,经过各种测试.排除,最终确定是服务端返回数据有误造成的.所以严格来说支付宝文档等没有什么问题,问题在于后端程序员不认真看文档和测试. 申请id需要 ...

最新文章

  1. python怎么学最快-零基础怎么样才能学好Python?Python入门必看
  2. idea配置tomcat的方法
  3. ntp如何确认与服务器偏差_CentOS 8 启用 NTP 服务
  4. [BZOJ3626] [LNOI2014] LCA 离线 树链剖分
  5. 零基础带你学习MySQL—Insert语句以及注意事项(七)
  6. 微信推视频红包;百度春晚红包互动 137 亿次;谷歌用皮影庆猪年 | 极客头条...
  7. 暑假集训第四场选拔赛 解题报告
  8. 电视android怎么连接手机助手下载,电视与手机怎么连接?最实用的三种小技巧!...
  9. LabVIEW编程LabVIEW控制PXI-5122例程与相关资料
  10. PENCIL 决策建模器
  11. 如何远程桌面局域网内计算机,如何使用远程桌面控制局域网中的另一台计算机...
  12. Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排
  13. linux 课程标准,《Linux操作系统及应用》课程标准.doc
  14. R语言实现数据按照行排序
  15. mysql只能导出65535条_导出Excel超过65535条限制解决方案
  16. .net调用百度api统计接口
  17. web项目高并发量网站解决方案
  18. ZigBee的发展也有“碎片化”
  19. Linux C语言高级学习第八天(gcc代码优化makefile)
  20. 比Everything还好用的搜索软件 - listary

热门文章

  1. 安卓前端车牌识别技术应用
  2. 为什么模电这么难学?一文带你透彻理解模电
  3. 字符,字节和编码三者的关系
  4. 多屏幕多分辨率的支持和一些概念
  5. 你值得拥有的一份面试题
  6. 几个必须知道的Python工具
  7. 常见的状态码HTTP Status Code
  8. (已修正精度 1mm左右)Realsense d435i深度相机+Aruco+棋盘格+OpenCV手眼标定全过程记录
  9. 游戏开发物语方案点数分配_最好的搭配 游戏开发物语攻略游戏方案怎么选
  10. JSON与事件和BOM