移动支付之支付宝支付

原创 2016年06月02日 10:16:12

一、编写目的:

本人为后端java程序员,现公司有一个需求是要开发APP上的支付宝支付。因为之前没有做过这块的接入,所以我一开始也不清楚要做什么,也没有什么思路。鼓弄了两天终于实现了,希望给没有思路的朋友一些帮助,同时也记录一下整个开发过程。


二、开发前准备:

  1. 合作身份者ID:以2088开头由16位纯数字组成的字符串

  2. 卖家支付宝账号:也就是收款方的支付宝账号

  3. 商户的私钥pkcs8格式(后端为Java的需要)

  4. 商户的私钥(暂时在程序中没有具体应用)

  5. demo下载

  6. demo下载步骤
    ①进入支付宝开放平台

    ②进入文档中心

    ③进入业务接入模块中移动支付,如图1

    图1:
    移动支付

    ④下载后的demo目录结构为,我选的是JAVA-UTF-8这个工程中的代码,如图2

    图2:
    demo目录结构

    JAVA-UTF-8工程中的目录结构可以查看工程中的readme.txt文件,里面说的都很清楚


三、开发思路:

APP上的支付宝支付开发,java服务端需要做些什么,这个问题从我一开始就在思考,也是这次接入的重点,所以我在支付宝开放平台的介绍中查看相关文档。支付宝也说的很清楚了,如下图在移动支付的快速接入中的介绍,如图3

图3:
快速接入
也就是说服务端负责生成订单及签名,及接受支付异步通知,而且根据图中我们还得到了一个信息就是demo中为了方面请求参数拼装和加签名都放在了客户端,应该放在服务端。看到这里,我想大致要做些什么都很清楚了,简单一句话就是!!!!demo中的客户端的代码在要在服务端进行实现!!!!


四、实现原理:

由于刚好本人在学习IOS开发(备注:我也是被我们公司的老大逼得,哎,一言难尽),所以我就把客户端的代码看了一下,在APViewController.m这个类中有了发现!!如图4

图4:
APViewController.m
也就是说客户端是根据一些参数拼接了一串订单字符串调用AlipaySDKdefaultService方法就能调起支付宝支付
!!!!所以说我们java服务端的工作就是在我们服务端生成这串字符串传给移动端就OK了!!!!,这也印证了支付宝开放平台给我们的介绍。


五、java后端代码分析(我有用到的类):

  • AlipayConfig类:支付宝支付配置类,配置:
    • 合作身份者ID
    • 商户的私钥
    • pkcs8格式的商户的私钥 (这个是我自己加上去的,因为我是java的服务端所以后面加签需要这个个格式的私钥)
    • 收款方的支付宝账号 (这个是我自己加上去的)
    • 服务器异步通知页面路径 (这个是我自己加上去的)
    • 设置未付款交易的超时时间(这个是我自己加上去的)
    • 接口名称(这个是我自己加上去的)

代码:

public class AlipayConfig {

// ↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 合作身份者ID,以2088开头由16位纯数字组成的字符串
public static String partner = "???";

public static String seller = "???";// 卖家支付宝账号、收款方的支付宝账号

public static String notify_url = "???";// 服务器异步通知页面路径

public static String it_b_pay = "???";// 设置未付款交易的超时时间 5m表示分钟

public static String mobile_service = "mobile.securitypay.pay";// 接口名称

// 商户的私钥pkcs8格式
public static String private_key_pkcs8 = "???";

// 商户的私钥
public static String private_key = "???";

// 支付宝的公钥,无需修改该值
public static String ali_public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB";

// ↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

// 调试用,创建TXT日志文件夹路径
public static String log_path = "C:\\ali\\";

// 字符编码格式 目前支持 gbk 或 utf-8
public static String input_charset = "utf-8";

// 签名方式 不需修改
public static String sign_type = "RSA";

}

  • AlipayCore类:支付宝接口公用函数类 (这个类我没有改动)

  • RSA类:RSA加签类 (这个类我没有改动)

  • UtilDate类:自定义订单类 (这个类我没有改动)

  • AlipayNotify类:支付宝通知处理类 (这个类我增加了一个getAllParam方法)


六、后端代码生成订单字符串:

1.生成订单字符串需要哪些参数:点击图3中的支付订单参数拼装及加签,如图五

图5:
支付订单参数拼装及加签

代码:

String orderNum = UtilDate.getOrderNum() + UUID.randomUUID().toString();
// 1.构建阿里支付订单参数map
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("partner", "\"" + AlipayConfig.partner + "\"");
paramMap.put("seller_id", "\"" + AlipayConfig.seller + "\"");
paramMap.put("out_trade_no", "\"" + orderNum + "\"");
paramMap.put("subject", "\"" + 商品名称 + "\"");
paramMap.put("body", "\"" + 商品详情 + "\"");
paramMap.put("total_fee", "\"" + 价格 + "\"");
paramMap.put("service", "\"" + AlipayConfig.mobile_service + "\"");
paramMap.put("payment_type", "\"" + "1" + "\"");
paramMap.put("_input_charset", "\"" + "utf-8" + "\"");
paramMap.put("it_b_pay", "\"" + AlipayConfig.it_b_pay + "\"");
paramMap.put("return_url", "\"" + "m.alipay.com" + "\"");
paramMap.put("notify_url", "\"" + AlipayConfig.notify_url + "\"");

// 2.参数map转string
String paramStr = AlipayCore.createLinkString(paramMap);

// 3.签名
String signStr = RSA.sign(paramStr, AlipayConfig.private_key_pkcs8, "utf-8");

// 4.签名URLEncoder编码
try {
        signStr = URLEncoder.encode(signStr, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return null;
    }

// 5.汇总参数string
String retrnStr = paramStr + "&sign=\"" + signStr + "\"&sign_type=\"RSA\"";

!!!!也就是说将retrnStr返回给移动端就可以了!!!!

七、后端代码接收支付宝发来的异步请求:

1.接收请求能接到哪些参数:点击图3中的通知处理什么时候会通知?收到通知时注意验签里面会有详细的介绍

2.这里提供一个获取request所有参数和值返回map的方法放在AlipayNotify类中

public static Map<String, String> getAllParam(HttpServletRequest request) {

        if (request == null)
            return null;

        Map properties = request.getParameterMap();
        Map<String, String> returnMap = new HashMap<String, String>();
        Iterator entries = properties.entrySet().iterator();
        Map.Entry entry;
        String name = "";
        String value = "";
        while (entries.hasNext()) {
            entry = (Map.Entry) entries.next();
            name = (String) entry.getKey();
            Object valueObj = entry.getValue();
            if (null == valueObj) {
                value = "";
            } else if (valueObj instanceof String[]) {
                String[] values = (String[]) valueObj;
                for (int i = 0; i < values.length; i++) {
                    value = values[i] + ",";
                }
                value = value.substring(0, value.length() - 1);
            } else {
                value = valueObj.toString();
            }
            returnMap.put(name, value);
        }
        return returnMap;
    }

3.定义一个支付宝发来的请求状态枚举AliPayStatusEnum

public enum AliPayStatusEnum {

    FINISHED("交易成功", "TRADE_FINISHED"),

    SUCCESS("支付成功", "TRADE_SUCCESS"),

    BUYER_PAY("交易创建", "WAIT_BUYER_PAY"),

    CLOSED("交易关闭", "TRADE_CLOSED");

    private String name;
    private String value;

    AliPayStatusEnum(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

4.接收支付宝发来的异步请求方法:

Map<String, String> params = AlipayNotify.getAllParam(request);

if (AlipayNotify.verify(params)) {//校验参数

    String status = params.get("trade_status");

    // 交易成功
    if (status.equals(AliPayStatusEnum.FINISHED.getValue())
                    || status.equals(AliPayStatusEnum.SUCCESS.getValue())) {
            //处理业务逻辑
    }
    // 交易关闭
    else if (status.equals(AliPayStatusEnum.CLOSED.getValue())) {
            //处理业务逻辑
    }

    // 交易创建
    else if (status.equals(AliPayStatusEnum.BUYER_PAY.getValue())) {
            //处理业务逻辑
    }
}
版权声明:本文为博主原创文章,转载请注明出处,谢谢。

支付宝Pay,一个类直接搞定

/**  * 支付宝支付  *   * @author lenovo  */ public class Alipay {   // 商户PID   public static final String...

带你走进Android微信支付和支付宝支付服务端操作放到客户端的故事

现在的APP大部分需要接入支付功能,而支付的主流就是微信支付和支付宝支付,网上关于微信支付和支付支付资料很多,但是这些资料随着官方的变动可能变得毫无用处,所以我建议直接看官方文档,微信开放平台和支付宝...

关于Android在线支付Alipay(支付宝)开发的经验分享

在近期,公司需要开发一个关于在线支付的模块,所以需要用到第三方支付平台 经过一周多的时间对这两种支付平台的研究,完成功能后将经验分享给大家,希望能帮助到有需求的朋友。 首先是支付宝的开发资...

支付宝支付之web篇

在接入支付宝支付前,你需要先和支付宝签约,web端要签约即时支付,app端支付要签约app支付。当然要是需要别的也可以根据需要签约 支付宝支付相对微信支付接入要简单一些,签约成功后,你就可以在你的...

关于Alipay支付宝接口(Java版)

1.alipay 双功能支付简介 2.alipay 提交支付订单 3.alipay 整合双功能支付及发货信息同步 4.alipay 页面跳转同步通知处理 5.alipay 服务器异步通知处理 ...

新版支付宝开放平台 手机网页支付 整个流程

新版支付宝开放平台  手机网页支付 整个流程 在支付宝签约如下产品 然后,使用支付宝最新的签名工具生成商户的私钥和公钥 值得注意的是,如果是.net c# 请选择PKCS1,我只采用1024...
  • hejisan
  • hejisan
  • 2017年06月29日 18:32
  • 2767

支付宝支付-服务端php对接移动端应用app

app支付 php服务端 支付宝php支付

支付宝API接口--移动端网页支付(沙箱)

前面一段时间,因为公司业务需求,需要使用支付宝的手机网站支付接口,因为自己也是第一次使用这个,中间走了不少弯路,现在总结一下,希望对遇到同样问题的朋友有帮助。     第一步:登录蚂蚁金服开放平台蚂...

移动端app支付宝支付

支付宝支付在国内算是大家了,我们到处都可以使用支付宝了,下文整理介绍的是在安卓app应用中使用支付宝进行支付的开发例子。 之前讲了一篇博客关与支付宝集成获取支付宝公钥与商户私钥的博客。这一片讲的是如...
  • liubag
  • liubag
  • 2015年11月04日 15:21
  • 3249

热爱编程~~~

看到下文, 感觉自己太弱了, 要重新好好的”热爱编程”.95年的时候,我高中同学郭军买了一本Borland C++手册,我们两个人此后两年没机会碰真的电脑,没见过Tubro C更没见过Borland ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:移动支付之支付宝支付
举报原因:
原因补充:

(最多只允许输入30个字)