支付相关(一):APP支付宝支付(JAVA服务端开发)

6 篇文章 0 订阅
6 篇文章 0 订阅

开发环境:springboot

最近一年两个项目开发,其中APP支付这块用到了微信支付,支付宝支付,以及转账到微信零钱,转账到支付宝账号等功能,下面会分成4个文章来介绍。

具体的开通微信和支付宝问题我不再叙述,直接上代码,代码会打包放在CSDN去下载,没有分的可以找我。

签约注意下支付宝和微信都要开通APP支付,支付宝开通单笔转账的支付宝账号,微信开通转账到零钱等

先从支付宝开始:

首先在pom.xml文件中添加支付宝SDK依赖

1支付宝参数配置类

/**
 * 支付宝配置
 */
public class AliPayConfig {
        //appid
        public static String APP_ID_USER = "";
        //应用私钥
        public static String PRIVATE_KEY = "";
        //应用公钥
        public static String APP_PUBLIC_KEY = "";
        //支付宝公钥
        public static String ALI_PUBLIC_KEY ="";
        //字符集
        public static String CHARSET = "utf-8";
        //URLs支付
        public static String URL = "https://openapi.alipay.com/gateway.do";
        //数据格式
        public static String FORMAT = "json";
        //加密方式
        public static String SIGN_TYPE = "RSA2";
        //接收支付宝回调地址notify_url //测试时候可以映射到本地地址可测试,不一定非要部署到线上
        public static String NOTIFY_URL="可访问的线上地址;
       

         //以下为支付宝授权登录所用
        //授权服务对应的名称
        public static String AUTH_API_NAME="com.alipay.account.auth";
        //授权服务接口名称方法
        public static String AUTH_API_METHOD="alipay.open.auth.sdk.code.get";
        //授权app_name调用来源方的标识
        public static String AUTH_APP_NAME="mc";
        //调用业务的类型,常量值为
        public static String AUTH_BIZ_TYPE="openservice";
        // pid签约的支付宝账号对应的支付宝唯一用户号
        public static String AUTH_PID="";
        //	产品码
        public static String AUTH_PRODUCT_ID="APP_FAST_LOGIN";
        //授权范围
        public static String AUTH_SCOPE="kuaijie";
        //	标识授权类型,
        public static String AUTH_TYPE="AUTHACCOUNT";
        //

}

上面参数配置一定要区分好,尤其是应用公钥和支付宝公钥。

2支付宝工具类,DTO,等

import java.io.Serializable;


/**
* @Description:    订单表用dto
*/
public class OrderDto implements Serializable {
    private static final long serialVersionUID = -27273789824211424L;
    private Integer userId;   //用户ID
    private String orderNo; // 商户订单号,适配每个渠道对此参数的要求,必须在商户系统内唯一
    private Float amount; // 订单总金额(必须大于0),单位为对应币种的最小货币单位,人民币为分
    private String subject; // 商品标题,该参数最长为 32 个 Unicode 字符
    private String body; // 商品描述信息,该参数最长为 128 个 Unicode 字符
    private String description; // 订单附加说明,最多 255 个 Unicode 字符
    private String wxZfbNum;//微信或支付宝支付成功微信支付宝生成的订单号
    private String aliAuthCode;//支付宝auth_code
   
    public Float getAmount() {
        return amount;
    }

    public void setAmount(Float amount) {
        this.amount = amount;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }


    
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

   

    public String getWxZfbNum() {
        return wxZfbNum;
    }

    public void setWxZfbNum(String wxZfbNum) {
        this.wxZfbNum = wxZfbNum;
    }

    public String getAliAuthCode() {
        return aliAuthCode;
    }

    public void setAliAuthCode(String aliAuthCode) {
        this.aliAuthCode = aliAuthCode;
    }

 
}
import java.io.Serializable;
import java.util.List;

public class ResultModel implements Serializable {

    private static final long serialVersionUID = -2376100248939876442L;

    private Integer status;//状态

    private String message;//返回信息,成功或者失败信息

    private String  pkColumn;//生成主键的名称

    private Integer pk;//插入操作时返回的主键

    private Integer maxId;//最大查询返回id

    private List<Object> resultList;//查询操作时返回的结果列表

    private Object resultObject;


    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Integer getPk() {
        return pk;
    }

    public String getPkColumn() {
        return pkColumn;
    }

    public void setPkColumn(String pkColumn) {
        this.pkColumn = pkColumn;
    }

    public void setPk(Integer pk) {
        this.pk = pk;
    }

    public Integer getMaxId() {
        return maxId;
    }

    public void setMaxId(Integer maxId) {
        this.maxId = maxId;
    }

    public List<Object> getResultList() {
        return resultList;
    }

    public void setResultList(List<Object> resultList) {
        this.resultList = resultList;
    }

    public Object getResultObject() {
        return resultObject;
    }

    public void setResultObject(Object resultObject) {
        this.resultObject = resultObject;
    }
}
import java.util.Date;

/**
 * 生成订单编号使用
 */
public class UUID {
    private static Date date = new Date();
    private static StringBuilder buf = new StringBuilder();
    private static int seq = 0;
    private static final int ROTATION = 99999;

    public static synchronized long next() {
        if (seq > ROTATION)
            seq = 0;
        buf.delete(0, buf.length());
        date.setTime(System.currentTimeMillis());
        String str = String.format("%1$tY%1$tm%1$td%1$tk%1$tM%1$tS%2$05d", date, seq++);
        return Long.parseLong(str);
    }

    private UUID(){

    }
}



3支付代码实现

app请求后台 和 支付宝支付成功通知

import com.alibaba.fastjson.JSONObject;
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.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


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

/**

 * 支付宝订单支付 
 */
@RestController
@RequestMapping("/pay/alipay")
public class AliPayController {

    //@Autowired
   // private IMicroAliPayService microAliPayService;
    @PostMapping("aliPayOrder")
    public ResultModel aliPayOrder(@RequestBody OrderDto dto, HttpServletRequest request,
                                   HttpServletResponse response) {
        ResultModel resultModel = new ResultModel();
        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APP_ID_USER, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT,AliPayConfig.CHARSET ,AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        String out_trade_no = String.valueOf(UUID.next());
        model.setBody(dto.getBody());
        model.setSubject(dto.getSubject());
        model.setOutTradeNo(out_trade_no);
        model.setTimeoutExpress("30m");
        model.setTotalAmount(dto.getAmount()+"");//订单价格
        model.setProductCode("QUICK_MSECURITY_PAY");
        aliRequest.setBizModel(model);
      
        aliRequest.setNotifyUrl(AliPayConfig.NOTIFY_URL);//3为充值订单
       
        String orderStr = "";
        try {
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliRequest);
            orderStr = aliResponse.getBody();//
            //我是在这把支付订单信息做的保存,生成预支付订单,把orderStr传给APP进行处理并支付
            resultModel.setStatus(1);
            resultModel.setMessage("生成预支付订单成功");
            resultModel.setResultObject(orderStr);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        
        return resultModel;
    }


}
/**
     * 支付成功接收支付宝支付成功通知
     *
     * @param request
     * @throws UnsupportedEncodingException,AlipayApiException
     */
    @PostMapping("aliPayInquiryNotify")
    public void aliPayNotify(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
        //获取支付宝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] + ",";
            }
            if (name.equals("trade_status")) {

                System.out.println("交易状态为:" + valueStr);
               
            }
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
       
        //切记alipaypublickey是支付宝的公钥,别错放应用公钥,如果再验签这出问题,先排查是否放错公钥,一般是这个问题造成
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
        //获取支付宝的通知返回参数
       

        if (flag) {//验证成功
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
            //支付宝交易号
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
            //客户订单编号
            String auth_app_id = new String(request.getParameter("auth_app_id").getBytes("ISO-8859-1"), "UTF-8");
            //买家登录支付宝id
            String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"), "UTF-8");
            //交易时间
            String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"), "UTF-8");
            //交易金额
            String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"), "UTF-8");

            //这里进行你的订单状态的更改,以及你的业务处理。处理完毕打印出success后,支付宝只会下发一次,否则会下发多次,可以查看文档理解下
             
             System.out.println("success");
    
    
        } else {//验证失败
            //TODO service 生成订单支付失败历史记录
            
            System.out.println("fail");
        }
        
    }

4以上三步就是支付宝支付JAVA服务端的开发

                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的支付宝支付下单服务端Java代码示例: ```java import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.response.AlipayTradePagePayResponse; public class AlipayService { // 支付宝网关地址 private static final String ALIPAY_GATEWAY = "https://openapi.alipay.com/gateway.do"; // 应用ID private static final String APP_ID = "your_app_id"; // 商户私钥 private static final String PRIVATE_KEY = "your_private_key"; // 支付宝公钥 private static final String ALIPAY_PUBLIC_KEY = "alipay_public_key"; // 编码格式 private static final String CHARSET = "UTF-8"; // 返回格式 private static final String FORMAT = "json"; // 签名类型 private static final String SIGN_TYPE = "RSA2"; public String createOrder(String outTradeNo, String totalAmount, String subject, String body) throws AlipayApiException { AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_GATEWAY, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.setReturnUrl("your_return_url"); request.setNotifyUrl("your_notify_url"); request.setBizContent("{" + "\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"" + "}"); AlipayTradePagePayResponse response = alipayClient.pageExecute(request); return response.getBody(); } } ``` 这段代码使用了支付宝提供的Java SDK,首先需要在支付宝开放平台注册应用并获取到应用ID、商户私钥和支付宝公钥。然后,通过`AlipayClient`创建一个支付宝客户端实例,设置相关参数,最后调用`pageExecute`方法发起支付请求,并返回支付页面的HTML代码。 请注意,上述代码中的`your_app_id`、`your_private_key`、`alipay_public_key`、`your_return_url`和`your_notify_url`需要替换为你自己的实际值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值