java支付宝app支付代码
来源:互联网 发布:手机淘宝号怎么注册 编辑:程序博客网 时间:2024/05/16 19:35
刚刚接触app支付宝支付的时候还是走了很多弯路的,希望看到的小伙伴们别要走那么多弯路。
最好以支付宝(蚂蚁金服)提供的文档和API去开发,网上别人写的一些加签方式,可能并不好用。
下面这个地址为App支付请求参数说明:
https://docs.open.alipay.com/204/105465/
还有支付宝的SDK下载地址:
https://docs.open.alipay.com/54/103419
把压缩包解压,之后就是这样:
打开readme.txt
把这两个jar包导入你们自己的项目里面,就可以直接用支付宝的加签方式了,根本就不需要你们自己写的,我就是这个走了不少弯路。
下面就上代码了:
public class AlipayConfig { // 合作身份者ID,以2088开头由16位纯数字组成的字符串 public static String partner = "2088*********4"; // 6.请求网关地址 public static String URL = "https://openapi.alipay.com/gateway.do"; public static String service = "mobile.securitypay.pay";//固定值 public static String seller_id = "*******@163.com"; //私钥 public static String private_key = ""; // 商户的公钥钥 public static String public_key =""; // 支付宝的公钥,无需修改该值(不要删除也不要修改,在接收通知的时候需要进行签名认证) public static String ali_public_key= ""; // 字符编码格式 目前支持 gbk 或 utf-8 public static String input_charset = "utf-8"; // 签名方式 不需修改 public static String sign_type = "RSA"; //APPID public static String APPID = "2017110809809345"; //支付宝回调地址 public static String notify_url = ""; // 8.返回格式 public static String FORMAT = "json"
关于支付宝的回调地址提供给你们一个可以穿透内网的工具:
https://natapp.cn/
通过这个网址获得一个地址,来穿透内网,测试一个支付宝支付还是可以的,具体的操作可以自行百度一下,还是比较简单的。
String orderStr=""; try { Map<String, String> orderMap = new LinkedHashMap<String, String>(); // 订单实体 Map<String, String> bizModel = new LinkedHashMap<String, String>(); // 公共实体 /****** 2.商品参数封装开始 *****/ // 手机端用 // 商户订单号,商户网站订单系统中唯一订单号,必填 orderMap.put("out_trade_no", orderPayRequest.getOrderId()); // 订单名称,必填 orderMap.put("subject", "***支付"); // 付款金额,必填 orderMap.put("total_amount", String.valueOf(orderPayRequest.getActualPayMoney())); // 销售产品码 必填 orderMap.put("product_code", "QUICK_WAP_PAY"); /****** --------------- 3.公共参数封装 开始 ------------------------ *****/ // 支付宝用 // 1.商户appid bizModel.put("app_id", AlipayConfig.APPID); // 2.请求网关地址 bizModel.put("method", AlipayConfig.URL); // 3.请求格式 bizModel.put("format", AlipayConfig.FORMAT); // 4.回调地址 bizModel.put("return_url", AlipayConfig.notify_url); // 5.私钥 bizModel.put("private_key", AlipayConfig.private_key); // 6.商家id bizModel.put("seller_id", AlipayConfig.partner); // 7.加密格式 bizModel.put("sign_type", AlipayConfig.sign_type + ""); /****** --------------- 3.公共参数封装 结束 ------------------------ *****/ // 实例化客户端 AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.private_key, AlipayConfig.FORMAT, AlipayConfig.input_charset, AlipayConfig.ali_public_key, AlipayConfig.sign_type); // 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest(); // SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); // model.setPassbackParams(URLEncoder.encode((String)orderMap.get("body").toString()));; // //描述信息 添加附加数据 // model.setBody(orderMap.get("body")); //商品信息 model.setSubject(orderMap.get("subject")); // 商品名称 model.setOutTradeNo(orderMap.get("out_trade_no")); // 商户订单号(自动生成) model.setTotalAmount(orderMap.get("total_amount")); // 支付金额 model.setProductCode(orderMap.get("product_code")); // 销售产品码 model.setSellerId(AlipayConfig.partner); // 商家id ali_request.setBizModel(model); ali_request.setNotifyUrl(AlipayConfig.notify_url); // 回调地址 AlipayTradeAppPayResponse responses = client.sdkExecute(ali_request); orderStr = responses.getBody(); System.err.println(orderStr); // 就是orderString 可以直接给客户端请求,无需再做处理 } catch (Exception e) { e.printStackTrace(); } return orderStr;
把得到的加了签的字符串给前端就好了,让他们直接去调用支付宝去支付,
还有一个支付宝回调的方法,这个方法并不需要前端访问,而是支付宝回调的:
这个方法的路径,就是支付宝的回调地址,当然了,你得让支付宝能访问你这个方法,内网测试就得用到刚刚用工具得到的地址来测试了:把这个加到刚刚得到的地址后面就好了:比如
http://3gtdkc.natappfree.cc/“项目名字”/order-pay-notify-controller
@RequestMapping(value = "/order-pay-notify-controller", method = {RequestMethod.POST,RequestMethod.GET }) public void notify(@RequestBody String body, HttpServletRequest requests, HttpServletResponse httpServletResponse) throws IOException { // 1.从支付宝回调的request域中取值 Map<String, String[]> requestParams = requests.getParameterMap(); System.out.println("从支付宝回调的request域中取值:requestParams===================================" + requestParams); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk"); params.put(name, valueStr); } // 2.封装必须参数 String out_trade_no = requests.getParameter("out_trade_no"); // 商户订单号 System.err.println("out_trade_no==================================" + out_trade_no); String orderType = requests.getParameter("body"); // 订单内容 System.out.println("orderType==================================" + orderType); String tradeStatus = requests.getParameter("trade_status"); // 交易状态 System.err.println("tradeStatus=================================" + tradeStatus); // 3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的) boolean signVerified = false; try { // 3.1调用SDK验证签名 signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ali_public_key, AlipayConfig.input_charset); System.out.println(signVerified); } catch (Exception e) { e.printStackTrace(); } } // 4.对验签进行处理if (signVerified) { // 验签通过if (tradeStatus.equals("TRADE_SUCCESS")) {// 只处理支付成功的订单:修改交易表状态,支付成功下面的就是你们自己的业务逻辑了 :成功和失败以后的逻辑了
好了,这就是支付宝app支付逻辑了,加签和验签的方法支付宝都封装好了,不需要我们自己写
阅读全文
0 0
- java支付宝app支付代码
- 支付宝支付(网站支付,APP支付,扫码支付) Java服务端代码
- 支付宝支付Java代码
- app支付--支付宝支付
- 支付-支付宝APP支付
- 支付--支付宝APP支付
- 支付宝app支付java服务端
- 支付宝APP支付Java服务端
- APP支付宝支付
- 支付宝APP支付
- APP支付宝支付
- java服务端,支付宝支付代码笔记
- java 微信APP支付代码
- 微信APP支付java代码【详解】
- java后端配合app前端的支付宝和微信支付(逻辑相关代码)
- Android app支付-支付宝
- 支付宝app支付开发
- 支付宝的app支付
- C语言哈夫曼树的实现---小勇勇
- 位运算的精髓
- 详解web标准
- CAMS
- 【SVN】svn服务器访问失败【由于连接方在一段时间后没有反应】
- java支付宝app支付代码
- 1030. 完美数列(25)
- Unity 相机 2D视角 与3D 视角 自由动态 切换
- 机器学习实战 adaBoost
- 告诉你外语学习的真实方法及误区分析(整理)
- 2017年web前端面试题目汇总!
- 【秋天再见】2017秋季回顾--- “图论”“程序员”“红帽”比赛
- 正则表达式,日期 日历
- Machine Learning(4)—Lessons by Andrew Ng