阿里云支付宝沙箱支付
项目文件是maven项目
第一步pom.xml引入jar包
<!-- 沙箱支付依赖-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.20.0.ALL</version>
</dependency>
创建一个 AlipayConfig 类
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下的支付宝公钥。
public static String alipay_public_key = "";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//支付成功后跳转的地址 改为自己修改订单状态的地址。
// public static String return_url = "http://本机ip地址:8081/order/updateOrderStatus";
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
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";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipay.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();
}
}
}
}
}
购物车页面的提交按钮,当点击提交,页面跳转到ShopcarController类,沙箱支付页面去,付完钱到OrderController类中。
submit();
function submit() {
// 获取全部的商品信息进行提交到后台
$.ajax({
url: "/shopcar/shopCarBalance",
data: {
bookid: bookid,
ids: ids,
totalcount: total_count,
totalprice: total_price,
cname: addName,
phone: addPhone,
address: addAddrerss,
express: express
},
dataType: "json",
type: "post",
success: function (addOrderObj) {
if (addOrderObj.code == 1) {
location.href="/shopcar/pay?orderno="+addOrderObj.data.ordernumber+"&money="+addOrderObj.data.totalprice;
} else {
layer.msg("提交订单失败!", {icon: 5})
}
}
})
}
}
ShopcarController类,沙箱支付页面
/**
* 确认订单
*/
@RestController
@RequestMapping("/shopcar")
public class ShopcarController {
@Autowired
private ShopcarMapper shopcarMapper;
@Autowired
private AddressMapper addressMapper;
@Autowired
private BookMapper bookMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private Order_detailMapper orderDetailMapper;
@Autowired
private BooktypeMapper bookTypeMapper;
/**
* 支付的时候添加到订单里面
* @param order
* @param session
* @return
// */
// shopCarBalance
@RequestMapping("shopCarBalance")
public CommonResult shopCarBalance(Order order, HttpSession session, Integer bookid, String ids,String count, String price){
User user = (User) session.getAttribute("user");
order.setPname(user.getName()); //下单人的姓名
order.setUid(user.getUid()); //下单人的编号
long orderNo = new Date().getTime();
order.setOrderNumber(orderNo+""+user.getUid()); //订单号
order.setStatus(5); //订单状态 5 未支付
order.setPdate(new Date()); //下单时间
System.out.println(order);
orderMapper.insert(order);
System.out.println("~~~~~~~~~~~~bookid==========="+bookid);
if (bookid !=null ){
//添加一本书
Book book = bookMapper.selectByPrimaryKey(bookid); //根据图书id查询图书信息
Order_detail orderDetail = new Order_detail();
orderDetail.setBookid(book.getBookid());
orderDetail.setBookname(book.getBookname());
orderDetail.setAuthor(book.getBookauthor());
orderDetail.setPublisher(book.getBookpublisher());
Integer count1 = Integer.valueOf(count);
orderDetail.setCount(count1);
orderDetail.setPrice(price);
Booktype booktype = bookTypeMapper.selectByPrimaryKey(book.getTypeid());
orderDetail.setBooktype(booktype.getBookType());
orderDetail.setUrl(book.getUrl());
orderDetail.setPid(order.getPid());
orderDetail.setStatus(0);
orderDetailMapper.insert(orderDetail);
}
// 添加多个
System.out.println("~~~~~~~~~ids~~~~~"+ids);
if (ids!=null && ids!=""){
String[] split = ids.split(",");//多个bookid
for (String s:split){
System.out.println(s);
}
System.out.println(split+"===========");
for (String s:split){
Integer ss = Integer.valueOf(s);
Shopcar shopcar = shopcarMapper.selectByPrimaryKey(ss);
Book book = bookMapper.selectByPrimaryKey(shopcar.getBookid());
System.out.println(book);
Order_detail orderDetail = new Order_detail();
orderDetail.setBookid(book.getBookid());
orderDetail.setBookname(book.getBookname());
orderDetail.setAuthor(book.getBookauthor());
orderDetail.setPublisher(book.getBookpublisher());
orderDetail.setCount(shopcar.getCount());
orderDetail.setPrice(shopcar.getPrice());
Booktype booktype = bookTypeMapper.selectByPrimaryKey(book.getTypeid());
orderDetail.setBooktype(booktype.getBookType());
orderDetail.setUrl(book.getUrl());
orderDetail.setPid(order.getPid());
orderDetail.setStatus(0);
orderDetailMapper.insert(orderDetail);
}
}
return new CommonResult(1,"添加订单成功",order);
}
/*沙箱*/
@RequestMapping("pay")
public String pay(String orderno, String money, HttpServletRequest request){
try {
//获得初始化的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(orderno.getBytes("ISO-8859-1"), "UTF-8");
//付款金额,必填
String total_amount = new String(money.getBytes("ISO-8859-1"), "UTF-8");
//订单名称,必填
String subject = new String("qy143图书管理".getBytes("ISO-8859-1"), "UTF-8");
//商品描述,可空
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"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();
return result;
}catch (Exception e){
e.printStackTrace();
}
return null;
//输出
}
}
OrderController 用户支付成功跳转这个页面
@Controller
@RequestMapping("order")
public class OrderController {
@Autowired
ShopcarMapper shopcarMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
Order_detailMapper order_detailMapper;
@RequestMapping("updateOrderStatus")
public String updateOrderStatus(String out_trade_no){
System.out.println(out_trade_no);
Order order=new Order();
order.setOrderNumber(out_trade_no);
order.setStatus(0);
orderMapper.updateOrderStatus(order);
return "redirect:/gereng.jsp";
}
}