一、编写目的:

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


二、开发前准备:

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

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

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

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

  5. demo下载

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

    ②进入文档中心

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

    图1:

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

    图2:

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


三、开发思路:

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

图3:

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


四、实现原理:

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

图4:

也就是说客户端是根据一些参数拼接了一串订单字符串调用AlipaySDK的defaultService方法就能调起支付宝支付
!!!!所以说我们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())) {//处理业务逻辑}
}

移动支付之支付宝支付相关推荐

  1. 个人开发者微信支付和支付宝支付

    个人开发者是不能申请微信支付和支付宝支付的 很多第三方使用添加二维码监听转账操作来实现是否功能

  2. 个人开发者只要一行代码接入微信支付和支付宝支付

    接入支付功能   对于个人开发者来说,我们很希望我们开发的App被广泛使用,同时可以获得一些额外收入,那就更好了.但是在微信开放平台或者支付宝开放平台申请支付功能,需要是企业才可以接入,对于我们个人开 ...

  3. 微信支付及支付宝支付开发指南

    从开始学习android开始到现在还没搞过三方支付,感觉挺遗憾的.看到最近有几篇关于微信支付和支付宝支付的文章,稍微进行一下整合,供大家参考. ---------------------------- ...

  4. 微信支付和支付宝支付整合(含设计模式1)

    微信支付和支付宝支付整合(含设计模式1) 1.说明: 设计模式:单例+策略模式+抽象 在开发中经常对接微信支付和支付宝支付,相对来说,阿里的文档比微信的接口文档清晰一点,这里用的第三方库(com.gi ...

  5. 关于微信支付,支付宝支付

    关于微信支付,支付宝支付 微信支付和支付宝支付属于第三方支付. 第三方支付是指具备一定实力和信誉保障的独立机构,通过与网联对接而促成交易双方进行交易的网络支付模式. 在第三方支付模式,买方选购商品后, ...

  6. php做微信支付和支付宝支付的方法

    php做微信支付和支付宝支付的方法 直接去官方下载demo 然后证书换一下 appid换下 就好了 如果测试成功 直接复制到项目中即可 这个方法目前是最好 最稳定的方法 查看原文:http://new ...

  7. 微信支付,支付宝支付,银联支付——三大支付总结

    银联支付,支付宝支付,微信支付的三大总结,之前也有写过两篇. 微信支付,支付宝支付,银联支付--三大支付总结: http://blog.csdn.net/androidstarjack/article ...

  8. 小猪o2o源码v14.17双系统版(生活通+营销系统)怎么配置微信支付和支付宝支付

    简单来说,微信支付和支付宝支付在微信平台配置方法是一致的,大同小异唯一不同的是应用平台上的配置方法,这里我们重要说明下小猪o2o系统上对接微信支付和支付宝支付的方法,篇幅有限这里先说下微信支付的配置方 ...

  9. 苹果关于微信网页支付和支付宝支付遇到的一些问题

    苹果关于微信网页支付和支付宝支付遇到的一些问题 1.微信网页支付,支付宝网页支付(现在都是用wkwebview,就不在写关于webview的了) static const NSString *Comp ...

  10. java实现微信支付与支付宝支付接口

    因为公司要求需要写支付宝支付与微信支付现在写完了,总结一下: 支付宝支付: 支付宝支付比较简单首先我说一下支付宝支付与微信支付大概的流程,就拿支付宝支付来说(微信同理) 首先去蚂蚁金服注册一下App ...

最新文章

  1. 8.2.5: Spring3.0新增的@DependsOn和@Lazy
  2. win7 ghost 安装串口驱动inf文件出现问题
  3. Java学习之javassist
  4. 上网速度快的浏览器_2020年浏览器国内市场占有率排行榜
  5. 洛谷 P2596 [ZJOI2006]书架 (splay)
  6. 水中浮力插件buoyancy_程序化河流后续——加入浮力系统
  7. python psutil模块怎么在线下载_python之psutil模块
  8. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_8 Mybatis中的返回值深入-调整实体类属性解决增和改方法的报错...
  9. spring-第三篇之ApplicationContext的事件机制
  10. java大作业 俄罗斯方块_俄罗斯方块Java程序设计
  11. 【O2O领域】外卖订餐APP商家手机端Axure原型作品(实战项目功能全)
  12. 深入AXI4总线-[三]传输事务结构
  13. python中交集并集用什么符号表示_python交集和补集的符号_python数组并集交集补集...
  14. 用计算机税额怎么计算,企业所得税计算器(企业税收怎么算计算器)
  15. 首都师范 博弈论 2 1 1占优策略与占优策略均衡
  16. 雨林木风 linux操作系统,“雨林木风”操作系统门户正式上线
  17. 软件测试学习书籍推荐【乐搏TestPRO】
  18. 如何在 SubSystem for Android 上安装应用?
  19. 论坛IP签名档PHP源码,简单几步,教你制作自己的显IP签名档
  20. 放大电路的用途与成:低频电压放大器放大电路

热门文章

  1. Python-Flask实战项目一:仿知乎轻量级web问答平台搭建
  2. 如何快速制作Gif动图
  3. 路由器 静态、动态路由的配置
  4. (OK) 编译 cm-13-kiwi for (华为 荣耀 5X) - 成功
  5. Android 5.0 调色 Palette调色功能
  6. 一师一优课计算机课程,教育部一师一优课在线会客室在南京成功直播
  7. odoo13-14电商插件
  8. 大数据毕设题目推荐 - 最新大数据毕设选题 - 毕业设计项目方向课题
  9. mysql占用CPU过高解决
  10. 账单php,php 处理微信账单