欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

支付宝支付Demo

程序员文章站 2024-02-26 17:06:28
...

刚开始学习支付宝支付开发,一点一点的记录,刚测试完【下单】

我是基于springboot写的
一、引jar包

  <!--阿里巴巴支付宝支付的SDK坐标-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.8.10.ALL</version>
        </dependency>

二、写配置类,需要在yaml里配置;不知道的可以去看下springboot

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.sql.DataSourceDefinitions;

@Component
@Data
public class AlipayConfig {
    // 商户appid
    @Value("${pay.appId}")
    public String APPID;
    // 私钥 pkcs8格式的
    @Value("${pay.private_key}")
    public String RSA_PRIVATE_KEY;
    // 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    @Value("${pay.notify_url}")
    public String NOTIFY_URL;
    // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
    public String RETURN_URL = "https://baidu.com";
    // 请求网关地址,沙箱是:https://openapi.alipaydev.com/gateway.do
    @Value("${pay.url}")
    public String URL;
    // 编码
    public String CHARSET = "UTF-8";
    // 返回格式
    public String FORMAT = "json";
    // 支付宝公钥(在应用中可以获取)
    @Value("${pay.public_key}")
    public String ALIPAY_PUBLIC_KEY;
    // RSA2
    public String SIGNTYPE = "RSA2";

}

yaml配置,写入自己的对应配置

pay:
  appId: 
  #私钥
  private_key: 
  #网关,这里配置的是支付宝沙箱
  url: https://openapi.alipaydev.com/gateway.do
  #公钥
  public_key: 


沙箱地址点这,需要登陆支付宝
用到的私钥公钥工具在这里

下面的类目前只写了下单的方法,后续更新

package com.example.zhifubao.service;
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.AlipayTradeQueryModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.example.zhifubao.config.AlipayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@Component
public class XiaDanPay {

@Autowired
private AlipayConfig alipayConfig;
/**
 * 下单的方法
 */
public String apppay(Long orderId,Long amount) throws Exception {

    //实例化客户端
    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();
    model.setOutTradeNo(orderId.toString());
    model.setTotalAmount(amount.toString());
    model.setTimeoutExpress("30m"); //该订单最晚付款时间
    model.setSubject("测试"); //商品的交易标题
    model.setProductCode("QUICK_MSECURITY_PAY");
    request.setBizModel(model);
    request.setNotifyUrl(alipayConfig.NOTIFY_URL); //通知路径
    try {
        //这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。

        String body = response.getBody();
        return body;
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    return null;
}

测试

 @Test
    void contextLoads() {
        try {
            String apppay = xiaDanPay.apppay(20150320010101001L, 11L);
            System.out.println("调用的方法---------");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

下载手机模拟器,打开官方调式apk
将测试输出的信息复制到模拟器中,点击去支付
支付宝支付Demo//后续持续更新。。。。
更新:
说明:下面的两个方法本地测试还有点问题暂时没有解决,大家学习即可,本人会尽快解决并更新,大家也可以留言。

/*
* 支付回调
* */
    public void paymentCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {

        final String resultFail = "fail";
        final String resultSuccess = "success";

        Map<String, String> params = new HashMap<String, String>(30);
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            StringBuilder valueStr = new StringBuilder().append("");
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr.append(values[i])
                        : valueStr.append(values[i]).append(",");
            }
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr.toString());
        }
        boolean signVerified = false; //调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.ALIPAY_PUBLIC_KEY, alipayConfig.CHARSET, alipayConfig.SIGNTYPE);
        } catch (AlipayApiException e) {
            log.error("【支付宝异步通知】支付宝回调通知失败 e={} params={}", e, params);
            responseBody(response, resultFail);
            return;
        }
        if (!signVerified) {
            log.error("【支付宝异步通知】验证签名错误 params={} ", params);
            responseBody(response, resultFail);
            return;
        }
        //书写业务代码

        //向支付宝发送成功接收通知
        responseBody(response, resultSuccess);
        return;
    }
    /**
     * 返回json
     */
    private void responseBody(HttpServletResponse response, String contentBody) {
        try {
            response.setContentType("type=text/javascript;charset=UTF-8");
            String s = contentBody;
            response.getWriter().write(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return;
    }

    /**
     * 查询支付结果
     */
    public String queryPayStatus(String orderId) throws Exception {
        //创建客户端
        AlipayClient alipayClient = new DefaultAlipayClient(
                alipayConfig.URL,
                alipayConfig.APPID,
                alipayConfig.RSA_PRIVATE_KEY,
                alipayConfig.FORMAT,
                alipayConfig.CHARSET,
                alipayConfig.ALIPAY_PUBLIC_KEY,
                alipayConfig.SIGNTYPE);
        //自己理解的意思:创建请求对象
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        //创建请求对象的参数,并设置参数值
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        request.setBizContent("{\"out_trade_no\":" + orderId + "}");//订单号
        //调用客户端的方法发送请求得到返回结果
        AlipayTradeQueryResponse response = alipayClient.execute(request); //执行方法
        if (response.isSuccess()) {
            return "SUCCESS";
        }
        return "FAIL";
    }

支付宝官方都有
支付宝支付Demo

声明:本人在学习阶段,写这些一来自己留个笔记二是分享,各位大佬发现问题可以留言,本人虚心学习,谢谢!!!