移动支付之支付宝支付
2016-06-02 10:16
387 查看
一、编写目的:
本人为后端java程序员,现公司有一个需求是要开发APP上的支付宝支付。因为之前没有做过这块的接入,所以我一开始也不清楚要做什么,也没有什么思路。鼓弄了两天终于实现了,希望给没有思路的朋友一些帮助,同时也记录一下整个开发过程。二、开发前准备:
合作身份者ID:以2088开头由16位纯数字组成的字符串卖家支付宝账号:也就是收款方的支付宝账号
商户的私钥pkcs8格式(后端为Java的需要)
商户的私钥(暂时在程序中没有具体应用)
demo下载
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())) { //处理业务逻辑 } }
相关文章推荐
- C#支付宝扫码支付代码完整版
- jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
- 基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
- 支付宝咻一咻怎么用 Android帮你实现咻一咻
- Android支付宝支付设计开发
- Android仿微信/支付宝密码输入框
- Android支付宝支付封装代码
- Android支付宝支付开发实例
- php支付宝手机网页支付类实例
- php进行支付宝开发中return_url和notify_url的区别分析
- php支付宝接口用法分析
- 支付宝接口开发集成支付环境小结
- 支付宝 接口开发帮助(asp,php,asp.net,jsp)
- JavaScript仿支付宝密码输入框
- Android波纹扩散效果之仿支付宝咻一咻功能实现波纹扩散特效
- js仿支付宝填写支付密码效果实现多方框输入密码
- 支付宝支付开发IOS图文教程案例
- 纯PHP代码实现支付宝批量付款
- python采用django框架实现支付宝即时到帐接口
- Android开发之实现GridView支付宝九宫格