zoukankan      html  css  js  c++  java
  • 支付宝对接步骤 (app)

    • 一 前提条件
    1. 开发平台注册: 地址:https://openhome.alipay.com
    2. 创建应用: 开发者中心 ➡ 选择你对接的类型(我这里是网页&移动应用)➡ 创建应用
    3. 完善应用:

                a、添加功能:app支付
                b、签约
                c、开发设置:应用信息里设置 接口加签方式 等

          4. 申请上线:提交申请,大概需要一天时间审核

    • 二 SDK下载

             1、选择相应的语言下载即可,地址: https://docs.open.alipay.com/54/103419/
             2、配置pom文件

    •  三 代码

            1、 发起支付接口

            

    /**
    * 支付宝支付
    * @param payRecord
    * @return
    */
    public MapResult aliPay(PayRecord payRecord){
      //实例化客户端
      AlipayClient alipayClient = AliPayUtils.getAlipayClient();
      //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
      AlipayTradeAppPayRequest request = new 
      AlipayTradeAppPayRequest();
      //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
      AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
      //model.setBody("我是测试数据");
      model.setSubject("玉米出行-油券");
      model.setOutTradeNo(payRecord.getId());
      model.setTimeoutExpress("10m");
      model.setTotalAmount(payRecord.getPayMoney().toString());
      model.setProductCode("QUICK_MSECURITY_PAY");
      request.setBizModel(model);
      request.setNotifyUrl(notifyUrlAliPay);
      String orderString = "";
      try {
        //这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        orderString = response.getBody();
        System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
      } catch (AlipayApiException e) {
        e.printStackTrace();
      }
      return MapResult.build(orderString);
    }
    

      


    2、AliPayUtils工具类

    /**
     * 2019/10/12 12:10 PM
     *
     * @author shoo
     * @describe 支付宝支付
     */
    public class AliPayUtils {
        public static final String APP_ID = "2019100912345678";
    
        /**
         * 应用公钥
         */
        public static final String APP_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ";
        /**
         * 支付宝公钥
         */
        public static final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w";
    
        public static final String APP_PRIVATE_KEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAA";
    
        public static final String SIGN_TYPE = "RSA2";
    
        public static final String CHARSET = "UTF-8";
    
        public static final String GATEWAY = "https://openapi.alipay.com/gateway.do";
    
    
        public static AlipayClient getAlipayClient(){
            AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY,APP_ID,APP_PRIVATE_KEY,"json", CHARSET, APP_PUBLIC_KEY, SIGN_TYPE);
            return alipayClient;
        }
    
    
    }
    

      

    3、支付成功后异步回调

    /**
         * 支付宝回调
         *
         */
        @PostMapping("/aliPay")
        public String aliPay(HttpServletRequest request){
            Map<String, String> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
            String paramsJson = JSON.toJSONString(params);
            logger.info("支付宝回调,{}", paramsJson);
            try {
                //验签
                boolean signVerify = AlipaySignature.rsaCheckV1(params, AliPayUtils.ALIPAY_PUBLIC_KEY, AliPayUtils.CHARSET,AliPayUtils.SIGN_TYPE);
                if(signVerify){
                    //todo 严格来说,这里还应该做订单号、金额等校验
                    String out_trade_no = (String) params.get("out_trade_no");//本系统付款ID
                    String trade_no = (String) params.get("trade_no");//淘宝系统中的交易流水号
                    //完成支付后的后续动作
                    updateOrder(out_trade_no, trade_no);
                }else{
                    logger.info("---支付宝回调,验签异常,param:[{}]" , paramsJson);
                    return "fail";
                }
            }catch (Exception ex){
                ex.printStackTrace();
                return "fail";
            }
            return "success";
        }
    
        // 将request中的参数转换成Map
        private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
            Map<String, String> retMap = new HashMap<>();
    
            Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
    
            for (Map.Entry<String, String[]> entry : entrySet) {
                String name = entry.getKey();
                String[] values = entry.getValue();
                int valLen = values.length;
    
                if (valLen == 1) {
                    retMap.put(name, values[0]);
                } else if (valLen > 1) {
                    StringBuilder sb = new StringBuilder();
                    for (String val : values) {
                        sb.append(",").append(val);
                    }
                    retMap.put(name, sb.toString().substring(1));
                } else {
                    retMap.put(name, "");
                }
            }
    
            return retMap;
        }
    

      

  • 相关阅读:
    RabbitMq windows 安装
    JQuery.Ajax()的data参数传递方式
    [转载]ASP.NET中TextBox控件设立ReadOnly="true"后台取不到值
    vue-cli 3.0脚手架搭建项目
    二、操作符
    一、JavaScript基础
    html苹方字体
    js十大排序算法收藏
    iframe高度自适应的6个方法
    CSS3:不可思议的border属性
  • 原文地址:https://www.cnblogs.com/shog808/p/12285176.html
Copyright © 2011-2022 走看看