手把手教你如何对接支付宝支付接口(奶爸级别)

手把手教你如何对接支付宝支付接口(奶爸级别)

步骤:

第一步:准备支付宝相关的参数,如appId、公私钥

第二步:写代码,搞起

第一步:

1.你需要登录支付宝https://open.alipay.com/platform/developerIndex.htm。

2.点击控制台—>研发服务

3.到这个地址上生成一对公私钥:https://miniu.alipay.com/keytool/create

4.私钥保存下来,是要放在项目配置里面的,公钥是下面的步骤要用到的。

5.复制上面的公钥,放到这个输入框里面

6.保存设置后,打开就可以看到这样的窗口,下面的【敲黑板了!!!支付宝公钥】是放在代码里面的,自己保存下来。

7.点击左边的【沙箱账号】,把账号密码保存下来,支付的时候要用到。

8.到了这一步,咱们所需要的配置基本上就准备齐了

请看配置

# 应用ID,您的APPID

alipay.appId=2021xxxx

# 支付宝公私钥生成地址:https://miniu.alipay.com/keytool/create

# 商户私钥,您的PKCS8格式RSA2私钥

alipay.merchantPrivateKey=第一次生成的私钥

# 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm

alipay.alipayPublicKey=支付宝公钥

# 页面跳转异步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问

alipay.notifyUrl=http://5ktbak.natappfree.cc/payment/alipay

# 页面跳转同步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问

alipay.returnUrl=http://5ktbak.natappfree.cc/alipayResult

# 签名方式

alipay.signType=RSA2

# 字符编码格式

alipay.charset=utf-8

# 支付宝网关

alipay.gatewayUrl=https://openapi.alipaydev.com/gateway.do

第二步

alipay.properties

# 应用ID,您的APPID

alipay.appId=2021xxxx

# 支付宝公私钥生成地址:https://miniu.alipay.com/keytool/create

# 商户私钥,您的PKCS8格式RSA2私钥

alipay.merchantPrivateKey=第一次生成的私钥

# 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm

alipay.alipayPublicKey=支付宝公钥

# 页面跳转异步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问

alipay.notifyUrl=http://5ktbak.natappfree.cc/payment/alipay

# 页面跳转同步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问

alipay.returnUrl=http://5ktbak.natappfree.cc/alipayResult

# 签名方式

alipay.signType=RSA2

# 字符编码格式

alipay.charset=utf-8

# 支付宝网关

alipay.gatewayUrl=https://openapi.alipaydev.com/gateway.do

AliPayResource.java

package com.alipay.resource;

import lombok.Data;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.PropertySource;

import org.springframework.stereotype.Component;

@Data

@Component

@ConfigurationProperties(prefix="alipay")

@PropertySource("classpath:alipay.properties")

public class AliPayResource {

private String appId;

private String merchantPrivateKey;

private String alipayPublicKey;

private String notifyUrl;

private String returnUrl;

private String signType;

private String charset;

private String gatewayUrl;

}

AlipayController.java

package com.alipay.controller;

import com.alipay.api.AlipayApiException;

import com.alipay.api.AlipayClient;

import com.alipay.api.DefaultAlipayClient;

import com.alipay.api.internal.util.AlipaySignature;

import com.alipay.api.request.AlipayTradePagePayRequest;

import com.alipay.resource.AliPayResource;

import com.alipay.utils.DateUtil;

import com.alipay.utils.JsonResult;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

/**

* @author: HuGoldWater

* @description:

*/

@Slf4j

@RestController

@RequestMapping("payment")

public class AlipayController {

@Autowired

private AliPayResource aliPayResource;

/**

* 前往支付宝进行支付

*/

@GetMapping(value="/goAlipay")

public JsonResult goAlipay(String merchantUserId, String merchantOrderId) throws Exception{

//获得初始化的AlipayClient

AlipayClient alipayClient = new DefaultAlipayClient(aliPayResource.getGatewayUrl(),

aliPayResource.getAppId(),

aliPayResource.getMerchantPrivateKey(),

"json",

aliPayResource.getCharset(),

aliPayResource.getAlipayPublicKey(),

aliPayResource.getSignType());

//设置请求参数

AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();

alipayRequest.setReturnUrl(aliPayResource.getReturnUrl());

alipayRequest.setNotifyUrl(aliPayResource.getNotifyUrl());

// 商户订单号, 商户网站订单系统中唯一订单号, 必填

String out_trade_no = merchantOrderId;

// 付款金额, 必填 单位元

String total_amount = "0.01"; // 测试用 1分钱

// 订单名称, 必填

String subject = "胡金水-付款用户[" + merchantUserId + "]";

// 商品描述, 可空, 目前先用订单名称

String body = subject;

// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。

String timeout_express = "1h";

alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","

+ "\"total_amount\":\""+ total_amount +"\","

+ "\"subject\":\""+ subject +"\","

+ "\"body\":\""+ body +"\","

+ "\"timeout_express\":\""+ timeout_express +"\","

+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

//请求

String alipayForm = "";

try {

alipayForm = alipayClient.pageExecute(alipayRequest).getBody();

} catch (AlipayApiException e) {

e.printStackTrace();

}

log.info("支付宝支付 - 前往支付页面, alipayForm: \n{}", alipayForm);

return JsonResult.ok(alipayForm);

}

/**

* 支付成功后的支付宝异步通知

*/

@RequestMapping(value="/alipay")

public String alipay(HttpServletRequest request, HttpServletResponse response) throws Exception {

log.info("支付成功后的支付宝异步通知");

//获取支付宝POST过来反馈信息

Map params = new HashMap();

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);

}

boolean signVerified = AlipaySignature.rsaCheckV1(params,

aliPayResource.getAlipayPublicKey(),

aliPayResource.getCharset(),

aliPayResource.getSignType()); //调用SDK验证签名

if(signVerified) {//验证成功

// 商户订单号

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 trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

// 付款金额

String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");

if (trade_status.equals("TRADE_SUCCESS")){

// String merchantReturnUrl = paymentOrderService.updateOrderPaid(out_trade_no, CurrencyUtils.getYuan2Fen(total_amount));

// notifyFoodieShop(out_trade_no,merchantReturnUrl);

}

log.info("************* 支付成功(支付宝异步通知) - 时间: {} *************", DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN));

log.info("* 订单号: {}", out_trade_no);

log.info("* 支付宝交易号: {}", trade_no);

log.info("* 实付金额: {}", total_amount);

log.info("* 交易状态: {}", trade_status);

log.info("*****************************************************************************");

return "success";

}else {

//验证失败

log.info("验签失败, 时间: {}", DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN));

return "fail";

}

}

}

Application.java

package com.alipay;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

运行Application,在页面输入localhost:9090/payment/goAlipay?merchantUserId=123456&merchantOrderId=654321

结果如下:

五月 08, 2021 11:30:51 下午 org.apache.catalina.core.ApplicationContext log

信息: Initializing Spring DispatcherServlet 'dispatcherServlet'

INFO DispatcherServlet:525 - Initializing Servlet 'dispatcherServlet'

INFO DispatcherServlet:547 - Completed initialization in 3 ms

INFO AlipayController:80 - 支付宝支付 - 前往支付页面, alipayForm:

把上面的html代码放到html文件中:

打开html文件后,会进入这个页面:

输入沙箱的账号密码:

输入密码后,就已经付款完成了,控制台会打印支付成功的回调通知。

INFO AlipayController:91 - 支付成功后的支付宝异步通知

INFO AlipayController:129 - ************* 支付成功(支付宝异步通知) - 时间: 2021-05-09 00:09:32 *************

INFO AlipayController:130 - * 订单号: 123123123123

INFO AlipayController:131 - * 支付宝交易号: 2021050922001489970501658602

INFO AlipayController:132 - * 实付金额: 0.01

INFO AlipayController:133 - * 交易状态: TRADE_SUCCESS

INFO AlipayController:134 - *****************************************************************************

如何让支付宝将付款成功的通知,回调到你本机,我使用的是内网穿透:Natapp,可以看到另一篇文章:https://blog.csdn.net/qq_17555933/article/details/116549415

源码地址:

链接: https://pan.baidu.com/s/1cgNiqa5gZoJcaHlikqm_XA 提取码: 16f7

相关推荐