java+uniapp支付宝app支付

java的uniapp版本的支付宝app支付

准备工作
1.先准备企业账号,然后创建应用,如图所示
在这里插入图片描述
在这里插入图片描述
创建应用获取app支付的能力并签约
2.根据官方文档生成公钥私钥
支付宝官方地址

先贴代码

相关配置

package com.yss.utlis.ali;

public class AlipayConfig {
    // 1.商户appid
    public static String APPID = "";

    //2.私钥 pkcs8格式的
    public static String RSA_PRIVATE_KEY = "";

    // 3.支付宝公钥
    public static String ALIPAY_PUBLIC_KEY = "";

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

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

    // 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 QUICK_MSECURITY_PAY = "QUICK_MSECURITY_PAY";
}

工具类代码

package com.yss.utlis.ali;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.yss.base.auth.utils.ApiResult;
import com.yss.base.msg.expection.BadRequestException;
import com.yss.pay.model.entity.AliOrder;
import com.yss.sys.model.entity.Combo;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class AliPayUtils {

    /**
     * 根据传过来的套餐id跳转支付宝支付
     *
     * @return
     * @Param id 套餐id
     */
    public static String pay(AliOrder aliOrder) {
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
                AlipayConfig.RSA_PRIVATE_KEY, "json", 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();
        model.setBody(aliOrder.getBody());
        model.setSubject(aliOrder.getSubject());
        model.setOutTradeNo(aliOrder.getOutTradeNo());
        model.setTimeoutExpress("30m");
        model.setTotalAmount(String.valueOf(aliOrder.getTotalAmount()));
        model.setProductCode(AlipayConfig.QUICK_MSECURITY_PAY);
        request.setBizModel(model);
        request.setNotifyUrl(AlipayConfig.notify_url);

        try {
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            request.setNotifyUrl(AlipayConfig.notify_url);
            System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
            return response.getBody();
        } catch (AlipayApiException e) {
            throw new BadRequestException("支付失败");
        }
    }


    public static boolean getType(Map<String, String> params) throws AlipayApiException {
        //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        return AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
    }


    public static Boolean aliPayRefund(AliOrder aliOrder) throws AlipayApiException {
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
                AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
                AlipayConfig.SIGNTYPE);

        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel();
        refundModel.setOutTradeNo(aliOrder.getOutTradeNo());
        refundModel.setRefundAmount(String.valueOf(aliOrder.getTotalAmount()));
        refundModel.setRefundReason("商品退款");
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        request.setBizModel(refundModel);
        AlipayTradeRefundResponse response = alipayClient.execute(request);
        System.out.println(response);
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        return response.isSuccess();
    }
}

支付部分给前端返回的是携带了订单的信息的通道,前端直接根据这个通道调取支付宝就可以进行支付了

  /**
     * 使用支付宝支付
     * @param id 套餐id
     * @return
     */
    @PostMapping("aliPay/{id}")
    @ApiOperation("使用支付宝支付")
    public ApiResult<String> aliPay(@PathVariable String id){
        return new ApiResult<>(aliOrderService.aliPay(id));
    }

 /**
     * 响应支付宝支付状态
     * @return
     */
    @PostMapping("/getAliPayType")
    @ApiOperation("响应支付宝支付状态")
    public ApiResult<Boolean> getAliPayType(HttpServletRequest request){
        return new ApiResult<>(aliOrderService.getAliPayType(request));
    }

    /**
     * 支付宝退款
     * @return
     */
    @PostMapping("/aliPayRefund")
    @ApiOperation("支付宝退款")
    public ApiResult<Boolean> aliPayRefund(String id){
        try {
            return new ApiResult<>(aliOrderService.aliPayRefund(id,null));
        } catch (Exception e) {
            throw new BadRequestException("退款失败");
        }
    }

service代码

package com.yss.pay.service.impl;

import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yss.base.auth.utils.SecurityUtils;
import com.yss.base.model.user.User;
import com.yss.base.msg.expection.BadRequestException;
import com.yss.base.service.user.UserService;
import com.yss.base.utils.StringUtils;
import com.yss.ope.model.entity.UserOrder;
import com.yss.ope.service.UserOrderService;
import com.yss.pay.model.entity.AliOrder;
import com.yss.pay.mapper.AliOrderMapper;
import com.yss.pay.service.AliOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yss.sys.model.entity.Combo;
import com.yss.sys.service.ComboService;
import com.yss.utlis.ali.AliPayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * <p>
 * 支付宝订单历史记录 服务实现类
 * </p>
 *
 * @author yinna
 * @since 2020-11-07
 */
@Service
public class AliOrderServiceImpl extends ServiceImpl<AliOrderMapper, AliOrder> implements AliOrderService {

    @Autowired
    private ComboService comboService;

    @Autowired
    private UserOrderService userOrderService;

    @Autowired
    private UserService userService;


    /**
     * 根据套餐id发起支付宝支付
     * @param id
     * @return
     */
    @Override
    public String aliPay(String id) {
        //代码逻辑
        return AliPayUtils.pay(aliOrder);
    }

    /**
     * 退款
     * @param id
     * @return
     */
    @Override
    public Boolean aliPayRefund(String id,String orderId) {
        //代码逻辑
        try {
            if (AliPayUtils.aliPayRefund(aliOrder)){
                //代码逻辑
            }else {
                return false;
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            throw new BadRequestException("退款失败");
        }
    }

    /**
     * 支付宝支付回调接口
     * @param request
     * @return
     */
    @Override
    public Boolean getAliPayType(HttpServletRequest request) {
        //获取支付宝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);
        }
        System.out.println(params + "\n--------------------------------------");
        try {
            if (AliPayUtils.getType(params)){
                //回调成功代码逻辑
                }else {
                    return true;
                }
            }
            return false;
        } catch (AlipayApiException e) {
            throw new BadRequestException("支付失败");
        }
    }

}

其实支付宝支付是非常简单明了的,当时也是一遍过,如果有什么写的不明白的评论区互相交流。后期再把微信支付和苹果内购放上来。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值