JavaWeb–仿小米商城(8): 订单支付[沙箱支付]
源码链接:https://pan.baidu.com/s/1_EmCT3Xmfqx94Fp5ygGRgg
提取码:yaoy
1 功能描述
订单创建后进入支付页面,整合支付宝沙箱支付
参考的博客:https://blog.csdn.net/hhb442/article/details/123304287
支付提示页面:点击提交订单,此时将订单数据存储到数据表
支付宝支付:一般开发中使用沙箱做模拟支付,点击支付支付跳转到支付宝沙箱支付界面
支付过程提示:
使用沙箱app扫码支付成功后跳转到支付成功提示界面
订单列表界面:支付成功可以通过点击我的订单查看订单列表
订单详情界面:通过点击订单列表中订单详情按钮打开该订单的详情信息界面
2 沙箱支付功能分析
2.1 在pom文件中添加依赖
<!-- 支付宝沙箱支付 -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.16.2.ALL</version>
</dependency>
3 代码实现
3.1 前端
3.1.1 修改链接地址
orderSuccess.html文件中
3.2 后端
3.2.1 PayServlet
在 PayServlet类中首先设置如下私有属性
APP_ID (appId,从沙箱管理页面获得) APP_PRIVATE_KEY (应用私钥,最开始在密钥工具生成而 来) ALIPAY_PUBLIC_KEY (支付宝公钥,上一步骤获得) GATEWAY_URL (支付宝网关地址,在开发 平台沙箱管理页面中获得) SIGN_TYPE (签名类型) NOTIFY_URL (异步回调地址,须是公网IP,后 面再解释) RETURN_URL (同步回调地址,可以是私网IP)
@WebServlet("/pay.do")
public class PayServlet extends BaseServlet{
//appid
private final String APP_ID = "2021000119697433";
//应用私钥
private final String APP_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG";
private final String CHARSET = "UTF-8";
// 支付宝公钥
private final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEF";
//这是沙箱接口路径,正式路径为https://openapi.alipay.com/gateway.do
private final String GATEWAY_URL ="https://openapi.alipaydev.com/gateway.do";
private final String FORMAT = "JSON";
//签名方式
private final String SIGN_TYPE = "RSA2";
//支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址
private final String NOTIFY_URL = "http://127.0.0.1/notifyUrl";
//支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址
private final String RETURN_URL = "http://localhost:8080/pay.do?action=returnUrl";
/**
* 支付方法
* @param request
* @param response
* @return
*/
public String alipay(HttpServletRequest request, HttpServletResponse response){
String dona_id=request.getParameter("oid");
String money=request.getParameter("omoney");
Float dona_money=0f;
if(money!=null) {
dona_money = Float.parseFloat(money);
//把dona_id项目id 放在session中
HttpSession session=request.getSession();
session.setAttribute("dona_id", dona_id);
//生成订单号(支付宝的要求?)
String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String user = UUID.randomUUID().toString().replace("-", "").toUpperCase();
String OrderNum = time + user;
//调用封装好的方法(给支付宝接口发送请求)
try {
return sendRequestToAlipay(OrderNum, dona_money, "xiaomi_shop");
} catch (AlipayApiException e) {
e.printStackTrace();
}
return Constants.REDIRECT + "/error.html";
}
return null;
}
/**
* 支付宝的异步通知路径
* @param request
* @param response
* @return
*/
public String returnUrl(HttpServletRequest request, HttpServletResponse response){
try {
// 获取支付宝GET过来反馈信息
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = (String) iter.next();
String[] values = (String