美文网首页第三方接入
支付宝APP支付(java后台版)

支付宝APP支付(java后台版)

作者: 奋斗_de_小青年 | 来源:发表于2019-05-17 14:33 被阅读0次

    本实例是基于springBoot框架编写

    一、流程步骤

    1.执行流程

    当手机端app在支付页面时,调起服务端创建订单(自己公司业务接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端得到参数后,调起支付宝支付环境支付,完成支付后后会调异步通知接口,此时需要给支付宝返回成功或者失败信息,

    返回支付成功页面,完成整个支付流程。

    二、java后台开发

    ①,添加依赖,我的是最新的sdk

    <!-- 支付宝支付 -->

    <dependency>

      <groupId>com.alipay.sdk</groupId>

      <artifactId>alipay-sdk-java</artifactId>

      <version>3.7.26.ALL</version>

    </dependency>

    ②支付宝基本配置 AlipayConfig

    **

    * 支付宝基础配置类

    */

    public class AlipayConfig {

        // 1.商户appid

        public static String APPID = "20190.......";

        //2.私钥 pkcs8格式的

        public static String RSA_PRIVATE_KEY = "4HPo2O+dTYVyp2SNZ8xMpwJGBx/Y1hJu1f79GhRsx+9rEpFEiGoty1hMwo7NAXEXeLIP7GjaQQP95+AlizjfqtWil7x/c0vzHY+USn0BTM8Dg28jM6brSZ+k76miqw88uhnNZnenWvrYHRJQu3mm5Sp75CMyn5yZ4banhGxVdXucC2Qv23tYsJbwEPYaARiOAHXtVrsz8vZ0DmGrR2yHIqqmFOVzHsJdYaiiGsE0sKaq3g7LmlXrqdSCvgUaKORWPdCEaWO3hQYtaRoDA3Tmdqwo0cEJtr0rNTLKpt0LAgMBAAECggEAD0RzXDFt8Z6ITs83gsmkEbIYmnvdcXK81SS1gfupSzejGvyKj/oXyL1FCEH6/f2IABxHM5OW2dNTy9dh0HAprpJNGHOpMtfkfLr6M9DcpchGikwPHWMXezJl1+/xj3pThvJ8ZdOYIP8kp/HOSf16RH5i1IUe4N1hPJuWRBRj/+nJ3k7wbfJvG7SMWUOmuTi9iGaSwFBVKnirIubDMrbGjOXW8FU2xz6IWqkTWXiRWkhOhd6lUA21QqjikQxF3LsrmIRV3mieTYbjpmr71nTkh590bEnIBbDQQL10s433HbXTL5PVdYOBZU/j+FQewBbNTpMVDQ+f+tEKTk9MwMOuKQKBgQDqxAawGdLuX8rTJuskc9DcDY1CqXs+jydlgxKNttwIc8BipW00j0JC+y7n+Jw2XqDqS5RZk9qD0AUDdG0BC81H";

        // 3.支付宝公钥

        public static String ALIPAY_PUBLIC_KEY = "a6Hd6aeqN7mTAKoZcArHnwWjtaGok312sFyY0tNgXTeG9fVE/2X";

        // 4.服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问

        public static String notify_url = "http://xxx/appAlipay/notifyUrl";

        //5.页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址

        public static String return_url = "http://xxx/return_url.do";

        // 6.请求支付宝的网关地址

        public static String URL = "https://openapi.alipay.com/gateway.do";

        // 7.编码

        public static String CHARSET = "UTF-8";

        // 8.返回格式

        public static String FORMAT = "json";

        // 9.加密类型

        public static String SIGNTYPE = "RSA2";

    }

    ③支付核心

    /**

    * 支付宝app支付

    */

    @RestController

    @RequestMapping("/appAlipay")

    public class AppAlipayController extends BaseController {

        /**

        * 统一下订单签名

        *

        * @param orderId 订单id

        * @return

        */

        @RequestMapping("/signParams")

        public ResultJson signParams(@RequestParam Long orderId) {

            logger.info("appAlipay/signParams");

            try {

              //自己的业务逻辑创建订单

                  、、、、、、、、、

                //实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型),为了取得预付订单信息

                AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);

                //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay

                AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

                //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。

                AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();

                //业务参数传入,可以传很多,参考API

                //model.setPassbackParams(URLEncoder.encode(request.getBody().toString())); //公用参数(附加数据)

                model.setBody(body.toString());//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。

                model.setSubject(subject.toString());//商品名称

                model.setOutTradeNo(Long.toString(orderId));////商户订单号

                model.setTimeoutExpress("30m");//交易超时时间

                model.setTotalAmount("0.01");//支付总金额

                model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码,商家和支付宝签约的产品码

                request.setBizModel(model);

                request.setNotifyUrl(AlipayConfig.notify_url);//异步回调地址(后台)

                //这里和普通的接口调用不同,使用的是sdkExecute

                AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

                String orderString = response.getBody();//就是orderString 可以直接给客户端请求,无需再做处理。

                return successs(orderString);

            } catch (AlipayApiException e) {

                e.printStackTrace();

                return errorr(CodeMsg.PAY_FAIL);

            }

        }

    }

    ④支付支付成功后,调用后台异步通知接口

    /**

        * 异步通知处理

        *

        * @param request

        * @return

        */

        @RequestMapping(value = "notifyUrl", method = RequestMethod.POST)

        public String notify(HttpServletRequest request) {

            try {

                //获取支付宝POST过来反馈信息

                Map<String, String> params = new HashMap<String, String>();

                Map requestParams = request.getParameterMap();

                for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {

                    String name = (String) iter.next();

                    String[] values = (String[]) requestParams.get(name);

                    String valueStr = "";

                    for (int i = 0; i < values.length; i++) {

                        valueStr = (i == values.length - 1) ? valueStr + values[i]

                                : valueStr + values[i] + ",";

                    }

                    //乱码解决,这段代码在出现乱码时使用。

                    //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");

                    params.put(name, valueStr);

                }

                //签名验证(对支付宝返回的数据验证,确定是支付宝返回的)

                //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。

                //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)

                boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);

                //对验签进行处理

                if (signVerified) {  //验签通过

                    if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {//只处理支付成功的订单: 修改交易表状态,支付成功

                        //业务处理

                        String out_trade_no = params.get("out_trade_no");            // 商户订单号

                        return "success"; //成功

                    } else {//支付失败

                        return "fail";

                    }

                } else {// 验证失败

                    return "fail";

                }

            } catch (AlipayApiException e) {

                e.printStackTrace();

                return "fail";

            }

        }

    三,到此支付支付完成。

    相关文章

      网友评论

        本文标题:支付宝APP支付(java后台版)

        本文链接:https://www.haomeiwen.com/subject/xynicxtx.html