使用沙箱版支付宝过程
一、公钥私钥的填写
1、打开支付宝开发平台官网—》登录—》进入管理中心(沙箱环境会进行不定期的维护,我连续等了几天也打不开,最后我换了一个浏览器就可以了)
2、现在就需要去下载解决密钥的问题
2.1 进入在支付宝开发平台首页—》开发服务中的沙箱
3、然后跟着步骤下载一个密钥生成工具
5、打开这个工具
然后复制应用公钥,把复制的应用公钥粘贴到刚才打开的沙箱应用中
密钥到这里就相当于解决了
二、引入config配置
1.引入依赖(这里可以自行去maven仓库下载沙箱依赖)
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.16.30.ALL</version>
</dependency>
2.项目目录
该类也可以直接从官方文档里将该类复制过来。官方文档下载地址为:https://docs.open.alipay.com/270/106291
package com.lzh.zfbpaydemo.paycommon;
import java.io.FileWriter;
import java.io.IOException;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "对应沙箱中的APPID";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "你利用支付宝秘钥工具生成的私钥";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "你利用支付宝秘钥工具生成的公钥";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
public static String notify_url = " http://49.269.31.237:8081 /pay/synnotify";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
public static String return_url = "http://localhost:8080/pay/pay_success";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付宝网关
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();
}
}
}
}
}
注意点(我先用同步的方法测试,后面在改):
-
merchant_private_key:填的是刚才按照的工具里面生成的应用私钥(一定要保证复制粘贴得正确
-
gatewayUrl:我们这里是测试环境,所以使用的是:https://openapi.alipaydev.com/gateway.do
正式环境下我们使用:https://openapi.alipay.com/gateway.do -
public static Strin return_url = “http://localhost:8080/pay/pay_success”;这里的pay/pay_success相当于一个请求业务
三、开始写业务
1.先写一个测试的html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>测试支付</title>
</head>
<body>
<div>
<form th:action="@{/pay}" method="post">
订单id<input type="text" name="oid">
订单名称<input type="text" name="oname">
付款金额<input type="text" name="money">
描述<input type="text" name="desc">
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
2.写PayController
@Controller
public class PayController {
//先进入test页面,填写订单名称和订单金额填写好
@RequestMapping("/test")
public String pay(){
return "pay/test";
}
//这里可以选择不用传递订单号oid,下面我注释了随机生成的订单号,但也可以自己传递咯
@RequestMapping("/pay")
public String oderConfirm(String oid,String oname, String money, String desc, Model model) {
// //生成订单号
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
// String orderSn = simpleDateFormat.format(Calendar.getInstance().getTime());
//像支付宝发送请求
//初始化AlipClient
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 = oid;
//付款金额,必填
String total_amount = money;
//订单名称,必填
String subject = oname;
//商品描述,可空
String body = desc;
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-请求参数】章节
AlipayTradePagePayResponse result= null;
try {
result=alipayClient.pageExecute(alipayRequest);
} catch (AlipayApiException e) {
e.printStackTrace();
}
model.addAttribute("result", result);
return "pay/pay";
}
}
3.写让支付宝自动跳转的页面()
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>跳转的中转页面</title>
</head>
<body>
<div th:utext="${result}"></div>
</body>
</html>
这里说明一下(这里是我把坑解决了以后获取的值哦,到此为止,如果你们跟着我这个步骤写是得不出结果的):
如果使用:
![在这里插入图片描述](https://img-blog.csdnimg.cn/7f4c92abdeb54b7690fd6424b41bbe72.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5p-g5r6I77yB,size_20,color_FFFFFF,t_70,g_se,x_16)
说到这里是不是显示不出?因为我留了一个坑,哈哈哈!哈哈哈!,我之前眼睛找瞎都没有找到
到此为止的结果就是
我百度了好久,发现没有一个博主出现了类似的错误的,在泪奔~~~ 我调试了超级久。
好了吧,就不买关子了:答案就是在PayController中result赋值那里是错误的:
result=null接收的类型应该是String,而不是 AlipayTradePagePayResponse,对应的抛出异常那里的 result=alipayClient.pageExecute(alipayRequest);也要改成 result = alipayClient.pageExecute(alipayRequest).getBody();
最后修改我就截个图吧,怕你们还是不会改