阿里支付宝支付开发详细

时间:2024-05-19 07:17:55

无论在web开发、移动开发中,使用支付宝支付是必不可少的技能,本文将收集本人在开发中遇到的问题,也可以加入交流群244284555 和博主进行沟通

创建支付宝应用前提必须使用企业认证的支付宝账号,否则将无法创建应用

登录后进入开发者中心选择网页移动应用

阿里支付宝支付开发详细

选择支付接入

阿里支付宝支付开发详细

创建好应用后,需开通签约app支付或者网页支付功能,根据开发需求选择签约,这里会收取手续费,按每笔交易收取不同比例费用,提交后需等待审核完成,这个阶段使用支付功能将会报insufficient-isv-permissions错误。遇到此错误等待审核通过即可

阿里支付宝支付开发详细阿里支付宝支付开发详细

上传支付宝秘钥,下载地址:https://docs.open.alipay.com/291/105971

下载好后打开这个文件:

阿里支付宝支付开发详细

阿里支付宝支付开发详细

生成成功打开rsa_private_key_pkcs8.pem这个文件,进行应用公钥的上传,会自动生成支付宝公钥。

此时设置加密方式:如果没有设置加密方式,你将会遇到app支付成功后,接口并不会调用回调函数,这个地方一定要注意

阿里支付宝支付开发详细

接下来进入编码阶段:

/**
 * 支付宝支付配置
 */
public class AlipayConfig {

   // 商户appid
   public static String APP_ID = "";
   // 支付宝公钥
   public static String ALIPAY_PUBLIC_KEY = "";
   //应用私钥
   public static String APP_PRIVATE_KEY = "";

   /**
    * 5.服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    */
   public static String notify_url = "http://www.xxx.com/alipay/notify_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";

   /**
    * 10.订单有效日期
    */
   public static String TIMEOUT_EXPRESS = "7d";

   public static String PRODUCT_CODE = "QUICK_MSECURITY_PAY";

   /**
    * 支付回调接口&充值余额支付回调接口
    * 支付回调地址只有一个
    */
   public static String NOTIFY_URL = "";

   /**
    *  获取订单号的 key
    */
   public static String OUT_TRADE_NO = "out_trade_no";

   /**
    * 获取交易状态码的 key
    */
   public static String TRADE_STATUS = "trade_status";


   /**
    * 字符常量 “TRADE_SUCCESS”
    */
   public static String TRADE_SUCCESS = "TRADE_SUCCESS";

   /**
    *  字符常量 “TRADE_FINISHED”
    */
   public static String TRADE_FINISHED = "TRADE_FINISHED";


   /**
    * 字符常量 “app_id”
    */
   public static String APP_ID_NOTIFY = "app_id";


   /**
    *  字符常量 “total_amount”
    */
   public static String TOTAL_AMOUNT_NOTIFY = "total_amount";


   /**
    * 字符常量 “total_amount”
    */
   public static String SELLER_EMAIL_NOTIFY = "seller_email";

   /**
    * 字符常量 “元”
    */
   public static String YUAN = "元";



}

 @RequestMapping(value="/alipay", method={RequestMethod.POST})
    public Result alipay(@Valid OrderAlipayReq orderAlipayReq, HttpSession session,HttpServletRequest httpRequest){
        Result result = new Result();

        if(orderAlipayReq.getOrderId()==null){
            logger.info("参数订单号OrderId为空");
            result.setCode(MessageContants.FAIL);
            result.setMessage("参数订单号OrderId为空");
            return result;
        }
        if(orderAlipayReq.getPrice()==null){
            logger.info("参数订单号Price为空");
            result.setCode(MessageContants.FAIL);
            result.setMessage("参数订单号Price为空");
            return result;
        }
       
        MwOrder mwOrder = mwOrderRepository.findOne(orderAlipayReq.getOrderId());
        if(mwOrder==null){
            logger.info("根据OrderId查询订单信息为空,此订单不存在");
            result.setMessage("此订单不存在"+orderAlipayReq.getOrderId());
            result.setCode(MessageContants.FAIL);
            return result;
        }
       

        //订单ID   商品名称   价格
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APP_ID,
                AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
                AlipayConfig.SIGNTYPE);
        /**
         * 创建web请求消息
         */
    //    AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        /**
         * 创建app请求消息
         */
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        /**
         * 封装业务参数
         * SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
         */
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();

        String subject = orderAlipayReq.getMediaName();

        String orderNo = mwOrder.getOrderNo();
        String body = mwOrder.getOrderName();

        /**
         * 查询订单信息
         */
        // 支付订单详情
        model.setBody(body);
        // 支付订单标题
        model.setSubject(subject);
        // 支付订单编号
        model.setOutTradeNo(orderNo);
        // 订单超时时间
        model.setTimeoutExpress(AlipayConfig.TIMEOUT_EXPRESS);
        // 支付订单金额
        model.setTotalAmount("0.01");
       // model.setTotalAmount(createOrder.getTotalAmount());
        // 订单代码
        model.setProductCode(AlipayConfig.PRODUCT_CODE);

        request.setBizModel(model);

        logger.info("发起支付宝app成功,开始回调");

        //支付成功了,把订单编号缓存
   //     session.setAttribute("orderId",mwOrder.getOrderId());
        // 回调地址
        request.setNotifyUrl(AlipayConfig.NOTIFY_URL);

        /**
         * 支付宝响应体
         */
        AlipayTradeAppPayResponse response = null;
        //这里和普通的接口调用不同,使用的是sdkExecute
        try {
            response = alipayClient.sdkExecute(request);
            //处理支付后订单信息,上线后需放在回调接口中
/*
            mwOrder.setOrderId(mwOrder.getOrderId());
            //支付成功 "1",更新时间
            //未支付状态
            mwOrder.setStatus("0");
            mwOrder.setMediaOrderStatus("5");
            mwOrder.setUpdateTime(DateUtils.getNowDate());
            mwOrderRepository.save(mwOrder);
*/

            //支付后向账单表里添加记录
/*            MwBill mwBill = new MwBill();
            mwBill.setBillDescribe("支付宝消费"+orderAlipayReq.getPrice());
            mwBill.setConsumeAmount("0.01");
            mwBill.setConsumeTime(DateUtils.getNowDate());
            mwBill.setUserId(mwOrder.getUserId());
            mwBillRepository.save(mwBill);*/

        } catch (AlipayApiException e) {
            //如果回调失败了
            logger.info("支付失败");
            result.setCode(MessageContants.FAIL);
            result.setMessage("支付失败");
            logger.info(response.getBody());
            result.setData(response.getBody());
            e.printStackTrace();
            return  result;
        }
        logger.info("支付宝响应内容:{}",response.getBody());
        result.setData(response.getBody());
        result.setMessage("支付成功");
        result.setCode(MessageContants.SUCCESS);
        return result;
    }

只要账号信息无误,就能完成支付宝支付