支付宝支付之App支付

与微信支付对比,支付宝支付就没有那么多坑了,毕竟支付宝开放平台的文档还是描述的很详细的。

支付宝开放平台地址:https://docs.open.alipay.com/204/105297/

支付宝支付的流程如下图所示:

项目中接入支付宝支付的步骤:

在这里分为了三个文件进行整理:

  1. 基础信息配置文件:AlipayConfig.java
  2. 调用API接口:AliPayUtil.java
  3. 对外接口:AlipayController.java

AlipayConfig.java

此文件中主要是配置了应用ID、支付宝公钥、应用密钥等基础信息,以及支付宝支付API提供的对外接口地址信息。

 1 package com.xhgx.web.pay.aliPay;
 2
 3 import com.erenju.util.GlobleConfig;
 4
 5 /**
 6  * 支付宝支付基础信息配置
 7  * @author rxn
 8  * @date 2018/04/25
 9  */
10 public class AlipayConfig {
11
12     /**
13      * 合作身份者ID,签约账号,16位纯数字
14      */
15     public static String partner = "2088******";
16     /**
17      * 收款支付宝账号,一般情况下收款账号是签约账号
18      */
19     public static String seller_id = partner;
20     /**
21      * appid
22      */
23     public static String app_id = "2018*****";//正式
24 //    public static String app_id = "2016*****";//沙箱
25     /**
26      * MD5密钥,32位字符串
27      */
28     public static String key = "******";
29     /**
30      * 支付宝公钥 (使用工具生成)
31      */
32     public static String public_key = "";//正式
33     /**
34      * 应用密钥 (特别长)
35      */
36     public static String private_key = "";
37
38     /**
39      * 服务器异步通知页面路径,需http://格式的完整路径,不能加自定义参数,必须外网可以正常访问
40      * 异步通知页面,就是接受支付宝支付结果返回信息的Contrller,可以处理自己的支付后的逻辑
41      */
42     public static String notify_url = GlobleConfig.getProperty("PayNotifyUrl")+"/alipay/notify.json";
43     /**
44      * 服务器同步通知页面路径,需http://格式的完整路径,不能加自定义参数,必须外网可以正常访问
45      * 同步通知页面,就是支付宝支付成功后页面跳转的url
46      */
47     public static String return_url = GlobleConfig.getProperty("PayNotifyUrl")+"/alipay/return.json";
48     /**
49      * 签名方式 ,(必须与生成密钥的签名方式一致)
50      */
51 //    public static String sign_type = "MD5";
52     public static String sign_type = "RSA2";
53     /**
54      * 日志文件
55      */
56     public static String log_path = "";
57     /**
58      * 字符编码格式
59      */
60     public static String charset = "utf-8";
61     /**
62      * 返回格式
63      */
64     public static String format = "json";
65     /**
66      * 支付类型
67      */
68     public static String payment_type = "1";
69     /**
70      * 支付宝网关(app支付接口)
71      */
72     public static String AppPayUrl = "https://openapi.alipay.com/gateway.do";//线上
73 //    public static String AppPayUrl = "https://openapi.alipaydev.com/gateway.do";//调试
74 }

AliPayUtil.java

此文件为工具类文件,实现了调用支付宝API的一些接口,下面的代码中主要粘了调用支付的接口。

 1 package com.xhgx.web.pay.aliPay;
 2
 3 import java.net.URLEncoder;
 4 import java.util.HashMap;
 5 import java.util.LinkedHashMap;
 6 import java.util.Map;
 7 import org.activiti.engine.repository.Model;
 8 import org.springframework.security.web.header.writers.frameoptions.StaticAllowFromStrategy;
 9 import com.alipay.api.AlipayApiException;
10 import com.alipay.api.AlipayClient;
11 import com.alipay.api.DefaultAlipayClient;
12 import com.alipay.api.domain.AlipayTradeAppPayModel;
13 import com.alipay.api.request.AlipayTradeAppPayRequest;
14 import com.alipay.api.response.AlipayTradeAppPayResponse;
15
16 /**
17  * 支付宝支付调用API接口
18  * @author rxn
19  * @date 2018/04/28
20  *
21  */
22 public class AliPayUtil {
23
24     /**
25      * 创建订单
26      * @param orderId    订单id
27      * @param total_amount    付款金额(单位:元)
28      * @return
29      * @throws AlipayApiException
30      */
31     public static Map<String, Object> createOrder(String orderId,String total_amount) throws AlipayApiException{
32
33         String orderStr = "";
34         Map<String,Object> m = new HashMap<String, Object>();
35         try {
36             //封装订单
37             Map<String, String> orderMap = new LinkedHashMap<String,String>();
38             //公共参数
39             Map<String, String> bizModel = new LinkedHashMap<String,String>();
40
41             //商品参数封装
42             orderMap.put("out_trade_no",orderId);//商户订单号,必填
43             orderMap.put("subject", "*****");//订单名称,必填
44 //            orderMap.put("total_amount", total_amount);//付款金额,必填
45             orderMap.put("total_amount", 0.01+"");//付款金额,必填
46             orderMap.put("body", "");//商品描述,选填
47             orderMap.put("timeout_express", "30m");//超时时间,选填
48             orderMap.put("prodect_code", "QUICK_MSECURITY_PAY");//销售产品码
49
50             //公共参数封装
51             bizModel.put("app_id", AlipayConfig.app_id);//appId
52             bizModel.put("method", AlipayConfig.AppPayUrl);//请求网关地址
53             bizModel.put("format", AlipayConfig.format);//返回格式
54             bizModel.put("private_key", AlipayConfig.private_key);//密钥
55
56             //实例化客户端,只需要实例化一次即可
57             AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.AppPayUrl, AlipayConfig.app_id, AlipayConfig.private_key, "json", AlipayConfig.charset, AlipayConfig.public_key, AlipayConfig.sign_type);
58             //实例化具体API对应的request类,类名称和接口名称对应
59             AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
60
61             //传入参数,sdk已经封装了公共参数,这里只需传入业务参数。
62             //以下方法是sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)
63             AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
64 //            model.setPassbackParams(URLEncoder.encode(orderMap.get("body")));//公用回传参数,选填,UrlEncode之后才可以发送给支付宝。
65             model.setBody(orderMap.get("body"));//商品信息
66             model.setSubject(orderMap.get("subject"));//商品名称
67             model.setOutTradeNo(orderMap.get("out_trade_no"));//商品订单号
68             model.setTimeoutExpress(orderMap.get("timeout_express"));//交易超出时间
69             model.setTotalAmount(orderMap.get("total_amount"));//总金额
70             model.setProductCode(orderMap.get("prodect_code"));//销售产品码
71             model.setSellerId(AlipayConfig.seller_id);//支付宝用户id
72             ali_request.setBizModel(model);
73             ali_request.setNotifyUrl(AlipayConfig.notify_url);//回调地址
74
75             AlipayTradeAppPayResponse response = alipayClient.sdkExecute(ali_request);
76             orderStr = response.getBody();
77
78             if(response.isSuccess()){
79                 m.put("result", orderStr);
80                 m.put("code", 0);
81                 m.put("msg", "订单生成成功");
82             }else{
83                 m.put("code", 1);
84                 m.put("msg", "订单生成失败");
85             }
86
87         } catch (Exception e) {
88             // TODO: handle exception
89             m.put("code", 1);
90             e.printStackTrace();
91             m.put("msg", "订单生成失败");
92         }
93
94         return m;
95     }
96 }

AlipayController.java

此文件中主要是对外的异步通知接口,异步通知接口和同步通知接口性质是一样的,都是为了接收支付后平台返回的信息,下面的代码中只实现了异步通知接口。

  1 package com.xhgx.web.pay.aliPay;
  2
  3 import java.util.Date;
  4 import java.util.HashMap;
  5 import java.util.Iterator;
  6 import java.util.Map;
  7 import javax.servlet.http.HttpServletRequest;
  8 import javax.servlet.http.HttpServletResponse;
  9 import org.springframework.stereotype.Controller;
 10 import org.springframework.web.bind.annotation.RequestMapping;
 11 import org.springframework.web.bind.annotation.ResponseBody;
 12 import com.alipay.api.AlipayApiException;
 13 import com.alipay.api.internal.util.AlipaySignature;
 14 import com.xhgx.service.PayNotifyTblService;
 15 import com.xhgx.service.domain.PayNotifyTbl;
 16 import com.xhgx.web.SpringContextUtil;
 17 import common.Logger;
 18
 19 @Controller
 20 public class AlipayController {
 21
 22     public static Logger log = Logger.getLogger(AlipayController.class);
 23
 24     /**
 25      * 支付宝支付成功后,异步通知,回调该接口
 26      * @param request
 27      * @param response
 28      * @return
 29      */
 30     @ResponseBody
 31     @RequestMapping("/alipay/notify.json")
 32     public static String notifyUrl(HttpServletRequest request,HttpServletResponse response){
 33         log.info("支付宝支付:"+"异步通知");
 34         Map<String, String> params = new HashMap<String, String>();
 35
 36         //1.从支付宝回调的request中取值
 37         Map<String, String[]> requestParams = request.getParameterMap();
 38
 39         for(Iterator<String> iter = requestParams.keySet().iterator();iter.hasNext();){
 40             String name = iter.next();
 41             String[] values = requestParams.get(name);
 42             String valueStr = "";
 43             for(int i=0;i<values.length;i++){
 44                 valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
 45             }
 46             //乱码解决
 47 //            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
 48             params.put(name, valueStr);
 49         }
 50
 51         //2.封装必须的参数
 52         String out_trade_no = request.getParameter("out_trade_no");
 53         String orderType = request.getParameter("body");
 54         String tradeStatus = request.getParameter("trade_status");
 55         String app_id = request.getParameter("app_id");
 56         String trade_no = request.getParameter("trade_no");//支付宝交易号
 57         String notify_time = request.getParameter("notify_time");//通知时间
 58         String total_amount = request.getParameter("total_amount");//订单金额,单位元
 59
 60         //3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
 61         boolean signVerified = false;
 62         //3.1调用SDK验证签名
 63         try {
 64             signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.public_key, AlipayConfig.charset,AlipayConfig.sign_type);
 65         } catch (AlipayApiException e) {
 66             // TODO Auto-generated catch block
 67             e.printStackTrace();
 68         }
 69
 70         if(payNotifyTblService==null){
 71             payNotifyTblService= (PayNotifyTblService) SpringContextUtil.getBean(PayNotifyTblService.class);
 72         }
 73
 74         //创建有一个对象,保存通知信息,根据业务需求来决定
 75         PayNotifyTbl payNotifyTbl = new PayNotifyTbl();
 76         payNotifyTbl.setPay_type(2);//支付类型:2支付宝
 77         payNotifyTbl.setCreate_dt(new Date());
 78
 79         payNotifyTbl.setReturn_code(tradeStatus);
 80         payNotifyTbl.setResult_code(tradeStatus);
 81
 82         //4.对验签进行处理
 83         if(signVerified){
 84             if(tradeStatus.equals("TRADE_SUCCESS")){
 85
 86                 //支付成功,进行业务处理
 87
 88                     payNotifyTbl.setAppid(app_id);
 89                     payNotifyTbl.setOrder_id(out_trade_no);
 90                     payNotifyTbl.setTotal_fee(Double.parseDouble(total_amount));
 91                     payNotifyTbl.setTransaction_id(trade_no);
 92                     payNotifyTbl.setTime_end(notify_time);
 93                     payNotifyTbl.setPay_result("交易成功");
 94
 95                     payNotifyTbl = payNotifyTblService.save(payNotifyTbl);
 96
 97                     return "success";
 98                 }else{
 99                     payNotifyTbl.setPay_result("参数有误");
100                     payNotifyTbl = payNotifyTblService.save(payNotifyTbl);
101                     log.info("参数有误");
102                     return "fail";
103                 }
104             }else{
105                 payNotifyTbl.setPay_result("交易失败");
106                 payNotifyTbl = payNotifyTblService.save(payNotifyTbl);
107                 log.info("交易失败");
108                 return "fail";
109             }
110         }else{
111             payNotifyTbl.setPay_result("验签失败");
112             payNotifyTbl = payNotifyTblService.save(payNotifyTbl);
113             log.info("验签失败");
114             return "fail";
115         }
116     }
117
118     /**
119      * 支付宝支付成功后,同步通知
120      * @param request
121      * @param response
122      * @return
123      */
124     @ResponseBody
125     @RequestMapping("/alipay/return.json")
126     public static String returnUrl(HttpServletRequest request,HttpServletResponse response){
127         log.info("支付宝支付:"+"同步通知");
128
129
130
131         return null;
132     }
133 }

原文地址:https://www.cnblogs.com/ning0628/p/9239351.html

时间: 2024-08-24 20:25:06

支付宝支付之App支付的相关文章

支付宝支付接口-app支付沙箱环境

说明 开发阶段 需要验证自己的app支付加签是否正确,这里使用沙箱环境来进行模拟,使用ali的沙箱测试app和沙箱钱包app进行校验 准备阶段 1.进入沙箱页面 2.找到app支付文档 https://docs.open.alipay.com/204 3.获得服务端代码demo代码 注意:沙箱代码需要改为沙箱环境:https://openapi.alipaydev.com/gateway.do 正常流程是 app请求加签后的代码 去唤醒支付 然后异步通知 所以这里ressponse.getBod

TP5.1接入支付宝实现网页/APP支付完整请求回调流程(沙箱环境)

目前互联网项目如果涉及到第三方支付模块,那么支付宝/微信无非是最好的选择,此文先以支付宝为例讲解,想了解微信支付的可以看我之后的文章,当然支付也分很多种形式,比如扫码付.当面付.声波付.调用APP付,网页直接付等等.但最常用的形式还是服务端+APP+调用支付宝APP或服务端+网页扫码/调用支付宝APP/直接支付,所以接下来我就以ThinkPHP5.1作为服务端从接入SDK到实现支付请求以及回调业务流程完整的操作讲解一下,虽然我用的是TP5.1但是TP5和TP5.1在此使用过程中没有太大的区别,无

8. PHP接入微信的三种支付:APP支付、公众号支付、扫码支付

微信的支付逻辑与支付宝的支付有一些差别.为了让客户端忽略这些差别,统一调用.本sdk做了对应处理. # SDK调用 微信支付不同接口需要的参数会有差别.请大家在使用接口时,仔细查看文档. use Payment\ChargeContext; use Payment\Config; use Payment\Common\PayException; // 微信支付,必须设置时区,否则发生错误 date_default_timezone_set('Asia/Shanghai'); // 生成订单号 便

asp.net core 微信支付工具类(H5支付,扫码支付,公众号支付,app支付)之2-H5支付

上一篇说到微信扫码支付,今天来分享下微信H5支付,适用场景为手机端非微信浏览器调用微信H5支付惊醒网站支付业务处理.申请开通微信H5支付工作不多做介绍,直接上代码. 首先是微信支付业务类(WxPayService)中的方法,传上必要的参数,该方法将会构造请求XML字符串到微信api接口,H5支付用到的是返回XML参数的mweb_url的值,控制器中的Aciton方法调用该业务层方法得到mweb_url的值,此时,前端ajax调用控制器返回mweb_url值,直接将window.localtion

微信支付(APP支付)-服务端开发(二 )

如果你已经可以微信支付成功,那么你已经成功90%,剩下的就是订单确认问题了. 接上一篇文章,今天我们来谈一谈,订单查询与确认: APP端支付成功之后,会再次向服务端发起请求,确认付款订单时候成功,同时服务端也要根据订单号更新数据库,确保前后端一直性. 服务端收到APP端发送的请求后,回获取到APP端传递过来的订单号,拿到订单号后,同样的方式,拼接xml格式的字符串,发送微信端,查询订单信息,比如付款是否成功,付款金额,订单详情等等. /调用微信接口,查询订单是否支付成功 public Map<S

支付宝 app支付 沙盘使用

文档说明 沙箱测试: App支付沙箱接入注意点 1.app支付支持沙箱接入:在沙箱调通接口后,必须在线上进行测试与验收,所有返回码及业务逻辑以线上为准:2.app支付只支持余额支付,不支持银行卡.余额宝等其他支付方式:3.app支付只支持Android版接入,在使用sdk时,在支付接口前调用如下方法 EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); 用于切换沙箱环境与生产环境:如果不使用此方法,默认使用生产环境:在钱包不存在的情况下,会唤起h5支付: 注:在生

支付宝APP支付 统一下单 php服务端 tp5

/*支付宝第三方支付 * *生成APP支付订单信息 * @param number uid 用户id * @param string token 用户token * @param number oid 订单id * @param string title 标题 * @param string body 商品描述 * @parma float money 金额 * @param number ordernum 订单编号 */ 支付包官方文档 https://docs.open.aliyun.com

.Net后台实现微信APP支付

上一节分享了微信小程序支付的后台,这一节来分享一下微信APP支付的后台.微信APP支付和微信小程序差别不大,微信APP支付后台不需要微信登录凭证.后台下单时交易类型(trade_type)不再是"JSAPI",而是"APP".商户后台传递给支付端的下单参数也有所不同.由于微信小程序支付和APP支付使用的APPID不同,索性直接写了两套支付,不再在代码里区分究竟该使用小程序支付的配置参数还是APP支付的参数. 官方是这样介绍的 具体实现: 新建AppPayConfig

第四方支付、聚合支付介绍

第四方支付是聚合支付公司整合支付宝支付.×××支付.银联支付.京东钱包.QQ钱包.百度钱包等第三方支付接口,便于商户一次接入,享用多个支付接口.第四方支付公司面向移动互联网开发者提供×××支付.支付宝.银联支付.京东钱包.QQ钱包.百度钱包等主流支付渠道代接入服务,一站式解决支付接入.信息核验.数据分析等交易问题.商户可通过第四方支付公司申请×××扫码支付.×××H5支付.×××APP支付.支付宝等支付.商户直接与银行签订支付协议,商户接入银行支付系统,由银行与商户进行结算. 优点: 1.集成了