今天用Java的servlet和jsp测试支付宝接口案例
主要jar
alipay-sdk-java-4.10.58.ALL.jar
其次
commons-logging-api-1.1.jar
fastjson-1.2.72.jar
代码如下
项目结构
package zhifubao.servletTest;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alipay.api.AlipayApiException;
import zhifubao.service.order.OrderController;
/**
* @author YXqiang
*/
@WebServlet(description = "支付宝测试支付功能", urlPatterns = { "/mydo" })
public class zhifubaoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//String outTradeNo, String subject, String totalAmount, String body
System.out.println(req.getParameter("outTradeNo"));//交易编号
System.out.println(req.getParameter("subject"));//商品
System.out.println(req.getParameter("totalAmount"));//总价
System.out.println(req.getParameter("body"));//商品描述信息
String outTradeNo, subject, totalAmount, body;
outTradeNo=req.getParameter("outTradeNo");
subject=req.getParameter("subject");
totalAmount=req.getParameter("totalAmount");
body=req.getParameter("body");
OrderController order=new OrderController();
try {
String formestr =order.alipay(outTradeNo, subject, totalAmount, body);
req.setAttribute("mycalls", formestr);
req.getRequestDispatcher("main.jsp").forward(req, resp);
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package zhifubao.pojo;
//package com.louis.epay.alipay;
/**
* 支付实体对象
* 根据支付宝接口协议,其中的属性名,必须使用下划线,不能修改
*/
public class AlipayBean {
/**
* 商户订单号,必填
*
*/
private String out_trade_no;
/**
* 订单名称,必填
*/
private String subject;
/**
* 付款金额,必填
* 根据支付宝接口协议,必须使用下划线
*/
private String total_amount;
/**
* 商品描述,可空
*/
private String body;
/**
* 超时时间参数
*/
private String timeout_express= "100m";
/**
* 产品编号
*/
private String product_code= "FAST_INSTANT_TRADE_PAY";
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getTotal_amount() {
return total_amount;
}
public void setTotal_amount(String total_amount) {
this.total_amount = total_amount;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTimeout_express() {
return timeout_express;
}
public void setTimeout_express(String timeout_express) {
this.timeout_express = timeout_express;
}
public String getProduct_code() {
return product_code;
}
public void setProduct_code(String product_code) {
this.product_code = product_code;
}
}
package zhifubao.service.order;
//package com.louis.epay.service.impl;
import zhifubao.alipay.Alipay;
import zhifubao.pojo.AlipayBean;
import com.alipay.api.AlipayApiException;
public class PayServiceImpl implements PayService {
static Alipay alipay =new Alipay();
@Override
public String aliPay(AlipayBean alipayBean) throws AlipayApiException {
return alipay.pay(alipayBean);
}
}
package zhifubao.service.order;
import zhifubao.pojo.AlipayBean;
import com.alipay.api.AlipayApiException;
//package com.louis.epay.service;
/**
* 支付服务
* @author Louis
* @date Dec 12, 2018
*/
public interface PayService {
/**
* 支付宝支付接口
* @param alipayBean
* @return
* @throws AlipayApiException
*/
String aliPay(AlipayBean alipayBean) throws AlipayApiException;
}
package zhifubao.alipay;
import zhifubao.pojo.AlipayBean;
import zhifubao.service.AlipayProperties;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
/**
* 支付宝支付接口
*/
public class Alipay {
/**
* 支付接口
* @param alipayBean
* @return
* @throws AlipayApiException
*/
public String pay(AlipayBean alipayBean) throws AlipayApiException {
AlipayProperties pop=new AlipayProperties();
// 1、获得初始化的AlipayClient
String serverUrl = pop.getGatewayUrl();
String appId = pop.getAppId();
String privateKey = pop.getPrivateKey();
String format = "json";
String charset = pop.getCharset();
String alipayPublicKey = pop.getPublicKey();
String signType = pop.getSignType();
String returnUrl = pop.getReturnUrl();
String notifyUrl = pop.getNotifyUrl();
AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
// 2、设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
// 页面跳转同步通知页面路径
alipayRequest.setReturnUrl(returnUrl);
// 服务器异步通知页面路径
alipayRequest.setNotifyUrl(notifyUrl);
// 封装参数
alipayRequest.setBizContent(JSON.toJSONString(alipayBean));
// 3、请求支付宝进行付款,并获取支付结果
String result = alipayClient.pageExecute(alipayRequest).getBody();
// 返回付款信息
return result;
}
}
这里是properties配置
# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
appId: 201610****
# 商户私钥,您的PKCS8格式RSA2私钥
privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFA*********
# 支付宝公钥 对应APPID下的支付宝公钥。
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A*******
# 服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数 http://外网ip:端口/error.html
notifyUrl: http://**e.com/zhifubao/error.jsp
# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数 http://外网ip:端口/sccess.html
returnUrl: http://***/sccess.jsp
# 签名方式
signType: RSA2
# 字符编码格式
charset: utf-8
# 支付宝网关
gatewayUrl: https://openapi.alipaydev.com/gateway.do
# 日志地址
logPath: "D:\\zhifubao.txt"
//qq+{3433548009}