一、支付宝接口
1-1】官网中设置 配置信息
-
登录【支付宝开放平台】-【开发者中心】-【研发服务】 / 【沙箱当面付接入引导】是官方文档
1-2】创建项目
官方案例:下载 Java 代码案例 和 Maven 依赖。根据博文来亦可
本人项目SpringBoot:
yml 仅配置了一个 端口:80
SpringBoot 仅有一个spring-boot-starter-web
依赖
1/3 依赖
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.110.ALL</version>
</dependency>
2/3 官方 - 原配置文件
package com.alipay.config;
import java.io.FileWriter;
import java.io.IOException;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
// 【博主补充】开发者中心控制台 - 研发服务 - 沙箱应用
public static String app_id = "";
// 商户私钥,您的PKCS8格式RSA2私钥
// 【博主补充】从支付宝开放平台助力( 下载用于生成私钥的软件 ) 中取
public static String merchant_private_key = "";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
// 【博主补充】开发者中心控制台 - 研发服务 - 沙箱应用 - 【RSA2(SHA256)密钥(推荐)】中取
public static String alipay_public_key = "";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//【博主补充】 此路径暂未配置
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// 【博主补充】http://localhost/breakInfo
public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
// 【博主补充:沙箱环境网关】https://openapi.alipaydev.com/gateway.do
public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
// 支付宝网关
// 【博主补充】官方原文件,此时应该为 log 日志存储
public static String log_path = "C:\\";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3/3 Controller 层
package com.debj.day20200618_ali_zfb_api.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.debj.day20200618_ali_zfb_api.config.AlipayConfig;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
@Controller
public class PayController {
@ResponseBody
@RequestMapping(value = "/pay")
public void aliPay(
@RequestParam Map map,
HttpServletRequest request,
HttpServletResponse response) throws AlipayApiException, IOException {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
//商户订单号,商户网站订单系统中唯一订单号,必填
// String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
String out_trade_no = (String) map.get("WIDout_trade_no");
//付款金额,必填
//String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");
String total_amount = (String) map.get("WIDtotal_amount");
//订单名称,必填
//String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
String subject = (String) map.get("WIDsubject");
//商品描述,可空
//String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");
String body = (String) map.get("WIDbody");
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
// + "\"total_amount\":\""+ total_amount +"\","
// + "\"subject\":\""+ subject +"\","
// + "\"body\":\""+ body +"\","
// + "\"timeout_express\":\"10m\","
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节
//请求
String result = alipayClient.pageExecute(alipayRequest).getBody();
//输出
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println(result);
out.flush();
out.close();
}
@ResponseBody
@RequestMapping(value = "/breakInfo")
public String breakInfo(){
return "支付宝返回界面,注意 url 参数,附带了此次交易信息";
}
}
1-3】测试 及 Bug 排除
// 每次请求时需要将 订单编号修改
http://127.0.0.1/pay?WIDout_trade_no=asdfasdfwfadfw&WIDtotal_amount=100&WIDsubject=apple&WIDbody=OneApple
-
1/2 浏览器显示 h5 代码字符*
-
- bug 描述:
请求发送后,页面显示 h5 代码字符。
- bug 描述:
-
- but 解决:
response.setContentType("text/html;charset=utf-8");
2/2 遇到防钓鱼执法
- but 解决:
-
- bug 描述:
项目没有报错!浏览器没有异常。只是跳转到钩鱼执法页面
- bug 描述:
-
- bug 分析:
分析不出来
- bug 分析:
-
- bug 解决 01:
我将选看的参数皆配置上去了,启动项目,依旧遇到钓鱼执法 —— 【尝试失败】
- bug 解决 01:
-
- bug 解决 02:
从【谷歌浏览器】切换至【火狐浏览器】 —— 【尝试成功】
- bug 解决 02:
-
- bug 解决 03:
重启【谷歌浏览器】 —— 【尝试成功】
- bug 解决 03:
-
- 总结:
暂无
- 总结: