Android 集成 支付宝

2023-11-09

一.到支付宝官网https://b.alipay.com/order/techService.htm?channel=psl下载(快捷支付(无线))开发包。将alipay-sdk-common文件夹下的alipaysdk.jar ,alipaysecsdk.jar,alipaysecsdk.jar 拷贝到工程的libs下。

二.支付宝集成
在技术集成之前,商户需要在https://ms.alipay.com进行注册,并签约安全支付服务。签约成功后可获取支付宝分配的合作商户ID(PartnerID),账户ID(SellerID),调用接口时使用。

支付细节的实现,主要通过支付宝提供的一个支付安全服务安装包alipay_plugin_20120428msp.apk,首次使用,首先检查是否安装此插件,没有会提示安装。具体的支付细节,在这个插件内完成。大部分的支付平台也都是采用的这种方式。

调用支付宝的接口进行支付,主要有以下几个步骤

  1. 将商户ID,收款帐号,外部订单号,商品名称,商品介绍,价格,通知地址封装成订单信息

  2. 对订单信息进行签名

  3. 将订单信息,签名,签名方式封装成请求参数

  4. 调用pay方法。
    下面我们就从点击支付按钮开始:

ResultSingleBean rb6 = (ResultSingleBean) VolleyResponseHelper
                        .jsonToBean(response, 43);
                if (rb6.getRetCode() == 0) {

                    final PayDataBean bean = (PayDataBean) rb6.getRetObj();
                    new Thread() {
                        public void run() {
                            PayTask alipay = new PayTask(OrderDetailActivity.this);
                            // 设置为沙箱模式,不设置默认为线上环境
                            // alipay.setSandBox(true);
                            String result = alipay.pay(bean.getPayData());
                            Message msg = new Message();
                            msg.what = RQF_PAY;
                            msg.obj = result;
                            CommonUtils.logWrite("pay  result1111111111",result);
                            mHandler.sendMessage(msg);
                        }
                    }.start();
                } else {
                    CustomToast.showToast(rb6.getRetMessage(), OrderDetailActivity.this);

                }
    }

上面我将一些pay 方法需要的一些参数封装到bean 当中,实际开发中这个bean中的数据最好去从服务器获取,保证与支付宝平台数据的同步。
我们现在来看一下 pay()需要的参数:
主要包含商户的订单信息,key=”value”形式,以&连接。 支付参数示例如下: partner=”2088101568358171”&seller_id=”xxx@alipay.com”&out_trade_no=”0819145 412-6177”&subject=”商品名称”&body=”商品详情 “&total_fee=”0.01总金额”&notify_url=”http://notify.msp.hk/notify.htm用于通知服务器进行相关操作”&service=”mobile.securi typay.pay”&payment_type=”1”&_input_charset=”utf-8”&it_b_pay=”30m”&sign=”lBBK %2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfH XoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2F uGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D “&sign_type=”RSA”

若调用成功返回结果示例如下:
resultStatus={9000};memo={};result={partner=”2088101568358171”&seller_id= “xxx@alipay.com”&out_trade_no=”0819145412-6177”&subject=”测试”&body=”测试 测 试 “&total_fee=”0.01”&notify_url=”http://notify.msp.hk/notify.htm”&service=” mobile.securitypay.pay”&payment_type=”1”&_input_charset=”utf-8”&it_b_pay= “30m”&success=”true”&sign_type=”RSA”&sign=”hkFZr+zE9499nuqDNLZEF7W75RFFPs ly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZ gSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU=”}

具体参数请参考刚刚下载的sdk所附文档。

问了方便 我们将返回结果进行处理:

public class AliPayResult {
    static String str = "resultStatus={9000};memo={};result={partner=\"2088201363678709\"&seller_id=\"2088201363678709\"&out_trade_no=\"7078994\"&subject=\"速普商城订单No:7078994\"&body=\"0105041067 MOONY 尤妮佳 原装进口婴儿纸尿裤 L54片 *1\"&total_fee=\"0.01\"&notify_url=\"http%3a%2f%2fwww.supuy.com%2fbank%2fAlipay_MobileNotify_V2.aspx\"&service=\"mobile.securitypay.pay\"&payment_type=\"1\"&_input_charset=\"utf-8\"&it_b_pay=\"60m\"&success=\"true\"&sign_type=\"RSA\"&sign=\"WxHHLaeqXcoyViBJyQV1a2+luhry9umGDLnjSX4HrcH6Q6Un75KJwIT1QAWnHcXrVOPcAT9xD8Sk923SjUkQRA0VDh29IPNA26FV+aaxV5yMyPP/kBF+oKiQy01LhQswTZDTF7k21SR2PNEdjXFnHzQJvzjthILbgJp7aEASwLM=\"}";

    public static void main(String[] args) {
        AliPayResult result = new AliPayResult(str);
        result.getResult();
    }

    private static final Map<String, String> sResultStatus;

    private String mResult;

    String resultStatus = null;
    String memo = null;
    String result = null;
    boolean isSignOk = false;

    public AliPayResult(String result) {
        this.mResult = result;
    }

    static {
        sResultStatus = new HashMap<String, String>();
        sResultStatus.put("{9000}", "支付成功");
        sResultStatus.put("{4000}", "系统异常");
        sResultStatus.put("{4001}", "订单参数错误");
        sResultStatus.put("{6001}", "您已取消了本次订单的支付");
        sResultStatus.put("{6002}", "网络连接异常");
    }

    /**
     * 获取支付宝返回的支付状态信息
     * 
     * @return
     */
    public String getResult() {
        AliPayResultBean bean = Json2Bean(string2JSON(mResult, ";"));
        return sResultStatus.get(bean.getResultStatus());
    }

    private AliPayResultBean Json2Bean(JSONObject json) {
        Gson gson = new Gson();
        return gson.fromJson(json.toString(), AliPayResultBean.class);
    }

    public JSONObject string2JSON(String src, String split) {
        JSONObject json = new JSONObject();

        try {
            String[] arr = src.split(split);
            for (int i = 0; i < arr.length; i++) {
                String[] arrKey = arr[i].split("=");
                json.put(arrKey[0], arr[i].substring(arrKey[0].length() + 1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return json;
    }

    private String getContent(String src, String startTag, String endTag) {
        String content = src;
        int start = src.indexOf(startTag);
        start += startTag.length();

        try {
            if (endTag != null) {
                int end = src.indexOf(endTag);
                content = src.substring(start, end);
            } else {
                content = src.substring(start);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return content;
    }
}

返回结果封装:

public class AliPayResultBean extends BaseBean {

    /**
     * 状态代码 String 本次操作的状态返回值,标 识本次调用的结果,参见 “11.2 客户端错误码”。 不可空 9000
     */
    private String resultStatus;
    /**
     * 提示信息 String 保留参数,一般无内容。 可空
     */
    private String memo;
    /**
     * 本次操作 返回的结 果数据 本次操作返回的结果数据。 其中: &success="true"&sign_typ
     * e="RSA"&sign="xxx"之前 的部分为商户的原始数据。 success用来标识本次支付 结果。 sign="xxx"为支付宝对本次
     * 支付结果的签名,商户可以 使用签约时支付宝提供的 公钥进行验证。 不可空 partner="2088101568358
     * 171"&seller_id="alipay-te st09@alipay.com"&out_tr ade_no="0819145412-61
     * 77"&subject="《暗黑破坏 神 3:凯恩之书》"&body=" 暴雪唯一官方授权中文版! 玩家必藏!附赠暗黑精致手
     * 绘地图!绝不仅仅是一本暗 黑的故事或画册,而是一 个栩栩如生的游戏再现。 是游戏玩家珍藏的首选。
     * "&total_fee="0.01"&notify _url="http%3A%2F%2Fn otify.msp.hk%2Fnotify.ht
     * m"&service="mobile.secu ritypay.pay"&payment_ty pe="1"&_input_charset="
     * utf-8"&it_b_pay="30m"&s how_url="m.alipay.com"& success="true"&sign_typ
     * e="RSA"&sign="hkFZr+z E9499nuqDNLZEF7W75 RFFPsly876QuRSeN8W
     * MaUgcdR00IKy5ZyBJ4el dhoJ/2zghqrD4E2G2mNj s3aE+HCLiBXrPDNdLKC
     * ZgSOIqmv46TfPTEqopYf hs+o5fZzXxt34fwdrzN4m X6S13cr3UwmEV4L3Ffir
     * /02RBVtU="
     */
    private String result;

    public String getResultStatus() {
        return resultStatus;
    }

    public void setResultStatus(String resultStatus) {
        this.resultStatus = resultStatus;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

}

注意:
调用了支付服务之后,有两种方式返回交易结果:

  1. 支付结果作为接口返回的字符串返回。返回的参数包含在result字符串中,具体再进行解析。

  2. 支付宝服务器通知。商户需要提供一个http协议的接口,包含在参数里传递给安全支付,即notify_url。支付宝服务器在支付完成后,会用POST方法调用notufy_url,以xml为数据格式传输支付结果,然后支付宝回传的参数修改订单状态等操作。需要注意的是,商户服务器收到支付宝发的通知之后,需要返回一个纯字符串“success”,不然支付宝的服务器会持续调用七次回调url提供的接口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 集成 支付宝 的相关文章

  • 如何创建不在 ScrollView 中或已禁用 ScrollView 的 ListView?

    我想要 ListView 中的一些好东西 例如能够使用 ListAdapter 和项目选择等 但我不想要其中的 ScrollView 部分 我想以不同的方式自己实现该部分 为什么或如何做到这一点并不是这个问题的重点 所以请不要问 为什么 有
  • 获取带有注释的所有类并将它们添加到 android 中的 hashMap

    我不确定这是否可能 但我基本上希望能够轻松地将新项目添加到列表中 只需添加带有特殊注释的类即可 我能想到的唯一例子就是我目前正在做的事情 用户可以完成很多 挑战 目前我的应用程序中有一个用于 挑战 的包 我希望能够在该包中创建一个新类 给它
  • AppCompatActivity 中的 setListAdapter

    我有一个具有功能的程序listArray with extends AppCompatActivity但我的代码有错误 my code 新闻活动 public class NewsActivity extends AppCompatActi
  • 如何使用保存实例状态来保存活动状态?

    我一直在研究Android SDK平台 并且不太清楚如何保存应用程序的状态 因此 考虑到对 Hello Android 示例的这个小改动 package com android hello import android app Activi
  • Android 添加新日历

    我已经检查了所有从 Android 应用程序中创建新日历的方法 我见过的唯一方法是在最新的 api 版本中使用新的 Calendar API 但这似乎只有在您使用时才有效CalendarContract ACCOUNT TYPE LOCAL
  • 允许我的应用程序用户从单个帐户发布推文

    我有一个小应用程序 可以显示我的小国家 比利时的公共交通交通问题 例如 我在应用程序中创建了一个系统 允许用户在火车延误时警告所有人 我想做的是允许我信任的用户从我的帐户发布类似 用户 X 说 123456 号列车晚点 3 分钟 之类的推文
  • 文件路径在棒棒糖android中始终返回null

    这是我从内部存储 画廊 获取图像时的代码 在棒棒糖文件路径中返回始终为空 if requestCode PICK IMAGE if resultCode RESULT OK image successfully picked launchi
  • 如何在android中动态添加项目到listview

    有谁能够帮助我 我正在尝试在 Android 中创建一个 ListView 并且我正在尝试使用代码 不使用 XML 将项目加载到其中 这是我到目前为止的代码 tweetList ListView this findViewById R id
  • 聚合联系人会自动添加吗?

    您一定也在其他地方看到过这段代码 但显然这个异常没有答案 编辑 如果您来这里寻找通过 vcardio 恢复联系人的解决方案 这就是它 我在使用时得到了这个vCardIO http code google com p vcardio Andr
  • Android:随着设备移动在mapv2上绘制路径

    我正在制作一个应用程序 我必须在其中当我的设备移动时在地图上绘制路径 我搜索了我的教程但都显示在两点之间绘制路径但是我要当我的设备移动时绘制路径 任何有关此的帮助将不胜感激 当你的设备移动时 你的意思是什么 无论哪种方式 您都必须使用位置侦
  • 为什么找不到ImageView类?

    当我转到图形布局时 我在创建第一个 Android 应用程序 pdf Android Application Development for For Dummies 中的静默切换模式 时遇到了麻烦 在 main xml 文件中插入了 Ima
  • 从 Android Intent 打开图库应用

    我正在寻找一种打开方式Android来自意图的画廊应用程序 我不想返回图片 而是只是打开图库以允许用户使用它 就像他们从启动器中选择它一样 View pictures folders 我尝试执行以下操作 Intent intent new
  • 从MySQL php中的特定列获取最大ID和最小ID

    我是新来的php现在尝试从中检索数据MySQL到安卓 这是我的工作细节 table In 检索总小时数函数 我想检索最短 ID 时间 and 最大 ID 超时 from MySQL到安卓通过php最后使用下面的代码来获取总小时数 假设 ID
  • Android EditText:在触摸时选择所有文本,并在用户开始输入时清除。

    我的应用程序中有一个编辑文本 当用户触摸编辑文本时 应选择整个文本 而当他开始输入文本时 应清除文本 一个例子是浏览器地址栏 有什么办法可以做到这一点吗 请帮助我 您可以使用以下方法选择 EditText 中的所有文本 android se
  • 如何在fragment onCreateView中自定义android标题栏

    我正在尝试通过典型方法更改标题栏的视图 Override public View onCreateView LayoutInflater inflater ViewGroup group Bundle args Window window
  • 不要使用android内置的org.json

    我写了一个使用的库org json http json org A 来自 json org 假设 Android 使用相同的 在 android 中也称为org json B 只是它遗漏了一些相对关键的功能 现在我想做的是设置我的 grad
  • 在每个 Activity 上调用工具栏

    我的应用程序有一个工具栏 应该出现在每个视图上 目前 我在我的onCreate 我有每个活动的方法 Toolbar toolbar Toolbar findViewById R id toolbar setSupportActionBar
  • aSmack 即服务

    基本上我有一个运行整个项目的主类 该代码运行完美 尽管一旦应用程序失去焦点 它就会变得不活动 我想知道如何将其变成一项服务 一个会在启动时启动的 该应用程序将是一个用于通知的单向消息系统 IE 桌面客户端 gt Openfire 服务器 g
  • 规范注册 ID 和消息 ID 格式

    我的理解有问题Canonical Registration Id并让谷歌返回它 我特意注册了两次我的Android应用程序 以测试Canonical Registration Id 但是当我尝试向两者推送消息时Registration Id
  • TextView 用字母打乱了我的话

    我的要求 创建 传入气泡 其宽度按内容排列 最大宽度为 90 我有这个标记

随机推荐

  • Golang - restful-url的接口注册处理

    一 注册 根请求转到rootHandle 在rootHandle中为不同的url查找对应的处理接口并执行 1 tars业务端配置restful url与处理函数 指定url与对应的处理函数 type TarsHttpMux struct h
  • ubuntu20下安装配置x11vnc的步骤——多次亲测可用

    在Ubuntu 20 04中安装和配置x11vnc的步骤如下 打开终端并输入以下命令以安装x11vnc sudo apt get install x11vnc 安装完成后 输入以下命令以生成密码文件 sudo x11vnc storepas
  • 安徽大学研究生院计算机与科学,安徽大学研究生导师简介院系所计算机科学与技术学院姓名赵.doc...

    安徽大学研究生导师简介院系所计算机科学与技术学院姓名赵 安徽大学研究生导师简介 院 系 所 计算机科学与技术学院 姓名 赵姝 性别 女 出生年月 1979 10 导师类别 硕士生导师 技术职称 副教授 联系方式 zhaoshuzs2002
  • 数据预处理之重复值

    目录 0 前言 1 重复值的识别 1 1 DataFrame识别重复值 duplicated 1 2 Serier识别重复值 is unique 2 统计重复行的数量 duplicated sum 3 重复值的处理 0 前言 在实际数据采集
  • PYTHON飞机大战(第六天)

    OK 今天成功做出了多个外星人 代码来了 import sys import pygame from bullet import Bullet from alien import Alien def check keydown events
  • Java是动态语言吗?从《Java核心编程》探索真知

    目录 一 Java是动态语言吗 1 动态语言 2 静态类型 3 Java核心编程 中探索 为什么Java可以称之为 准动态语言 二 了解ClassLoader 1 类加载器 2 Bootstrap classLoader 3 URLClas
  • QT 添加背景图片,按钮不被覆盖

    QT设计窗体时 想添加背景图片 在设计器中 只需要右击窗体 gt 改变样式表 添加你想要的图片就可以了 不想覆盖按钮的话 主需要像上图那样就行了
  • LU分解的矩阵逆运算

    算法名称 矩阵求逆 基于LU分解法 LU分解算法评价 LU分解大约需要执行N3 3次内层循环 每次包括一次乘法和一次加法 这是求解一个 或少量几个 右端项时的运算次数 它要比Gauss Jordan消去法快三倍 比不计算逆矩阵的Gauss
  • Java菜鸟入门(20) Producer Consumer经典代码

    来自oracle官网 https docs oracle com javase 7 docs api java util concurrent locks Condition html class BoundedBuffer final L
  • U盘重装系统教程

    重装系统不管是U盘启动还是光盘启动 最终是否可以引导u盘装系统 很大取决于PE或者DOS系统能否识别出来U盘 一 准备工作 制作大白菜U盘启动盘 需要下载一个windows系统文件 就是win7系统 win10系统文件这类的 到U盘里 便可
  • 代理模式之静态代理

    一 什么是代理模式 代理模式 为其他对象提供一种代理 以控制对这个对象的访问 代理类的对象本身并不真正实现服务 我们在访问实际对象时 是通过代理对象来访问的 二 代理模式的分类 静态代理 代理和被代理之前都是确定的 都实现相同的接口或继承相
  • vue锚点定位(tab切换定位不同的div位置)

    1 效果演示 2 HTML部分 div class tabs div class info tit span class pointer css3 lang CN 集团简介 Group profile span span class poi
  • IntelliJ IDEA配置java环境以及解决IDEA不能直接运行单个JAVA文件

    写Java代码选择IEDA的原因是我之前用的Pycharm写python 而IEDA和pycharm几乎一模一样的用法 而且IEDE可以写Java Python等很多语言 只要安装了对应的插件 File gt Settings gt Plu
  • C语言 -- 链表(企业级,侵入式链表)

    目录 节点结构体的实现 初始化链表 插入链表 遍历链表 删除节点 销毁链表 用户test 侵入式链表 内核链表 普通单链表和侵入式单链表的区别在于 普通的单链表的结点指针域指向的是下一个结点的内存首地址 侵入式单链表的结点指针域指向的是下一
  • VUE设置Echarts Loading及样式

    1 先引入echarts import as echarts from echarts 2 利用Echart自带的loading方法 如果是动态数据应该放在请求之前开始loading 初始化 let charts echarts init
  • 前端工作怎么包装简历,需要掌握哪些知识项目

    要想找个好的工作 最少有几个项目实战拿的出来 Web前端岗位需要掌握的知识 一 前端相关概念建立 主要内容 浏览器的概念介绍 浏览器的作用 工作方式 浏览器的概念介绍 浏览器的作用 工作方式 HTTP协议 协议产生的原因 作用 及内容 页面
  • unbutu docker 添加日志

    新建的docker默认是没有日志的 如下展示 tail f var log cron log tail cannot open var log cron log for reading No such file or directory t
  • Windows terminal安装和配置

    Windows terminal终端比cmd强大许多 其中可以包含cmd和powershell甚至ubuntu子系统 同时还可以进行个性化 打造更精美的终端 安装 进入Windows自带的Microsoft Store 搜索Windows
  • 浏览器打开windows桌面应用

    场景需要在浏览器打开桌面安装的lis应用 这里用到注册表 注意 后面的 路径 两个斜杠 lis可以替换成其他需要打开的应用 lis reg 如下 保存双击执行下 Windows Registry Editor Version 5 00 HK
  • Android 集成 支付宝

    一 到支付宝官网https b alipay com order techService htm channel psl下载 快捷支付 无线 开发包 将alipay sdk common文件夹下的alipaysdk jar alipayse