1.开发前准备
支付宝1.0
partner : 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串
private_key : 商户的私钥,需要PKCS8格式,RSA公私钥生成
alipay_public_key : 支付宝的公钥
支付宝2.0
APPID : 商户应用ID
RSA_PRIVATE_KEY : 商户私钥
ALIPAY_PUBLIC_KEY : 支付宝公钥
2.开始开发
1.首先创建支付宝付款抽象类,1.0和2.0都继承此类,用于统一处理
/**
* 支付宝付款
*
* @author shaoying.c
**/
public abstract class AbstractAlipay {
protected Logger logger = LoggerFactory.getLogger("etrace");
/**
* 支付宝支付
*/
public abstract String pay(Map<String,String> payInfo);
}
2.实现1.0接口
/**
* 支付宝1.0实现
*
* @author shaoying.c
* @CreateDate 2017/7/14 14:15
**/
public class Alipay extends AbstractAlipay {
@Override
public String pay(Map<String, String> payInfo) {
以下参数均从payInfo获取(service、partner....)
//将请求参数打包
Map<String, String> paraTemp = new HashMap<> ();
paraTemp.put("service", service);//接口名称
paraTemp.put("partner", partner);//合作者身份ID
paraTemp.put("seller_id", seller_id);//卖家支付宝用户号
paraTemp.put("_input_charset",input_charset);//字符集编码
paraTemp.put("payment_type", payment_type);//支付类型
paraTemp.put("notify_url", notify_url);//异步通知页面路径
paraTemp.put("return_url", return_url);//同步通知页面
paraTemp.put("out_trade_no", tradeId);//商户订单号,必填
paraTemp.put("subject", subject);
paraTemp.put("total_fee", total_fee ));//付款金额,必填
paraTemp.put("show_url", show_url);//商品展示的超链接,必填
paraTemp.put("body", payInfo.get ( "subject" ));//商品描述
return AlipaySubmit.buildRequest(paraTemp, "get", "确认");
}
}
3.支付宝2.0实现
/**
* 支付宝支付2.0
*
* @author shaoying.c@adsl.cn
* @CreateDate 2017/7/14 11:43
**/
public class Alipay2 extends AbstractAlipay {
// 销售产品码 必填 H5支付
public static final String product_code="QUICK_WAP_PAY";
private AlipayClient alipayClient = null;
@Override
public String pay(Map<String, String> payInfo) {
logger.info ( "payInfo====" + payInfo );
AlipayConfig2.APPID = payInfo.get ("appId");
AlipayConfig2.RSA_PRIVATE_KEY = payInfo.get ( "private_key" );
AlipayConfig2.ALIPAY_PUBLIC_KEY = payInfo.get ( "aliPublicKey" );
alipayClient = new DefaultAlipayClient ( AlipayConfig2.URL, AlipayConfig2.APPID, AlipayConfig2.RSA_PRIVATE_KEY, AlipayConfig2.FORMAT, AlipayConfig2.CHARSET, AlipayConfig2.ALIPAY_PUBLIC_KEY, AlipayConfig2.SIGNTYPE);
//创建API对应的request
AlipayTradeWapPayRequest payRequest = new AlipayTradeWapPayRequest ();
//封装请求支付信息 out_trade_no: 商户订单号,不重复 、subject:订单标题、total_amount:订单总金额
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(payInfo.get ( "tradeId" ));
model.setSubject(payInfo.get ( "subject" ));
model.setTotalAmount(payInfo.get ( "total_fee" ));
model.setProductCode(product_code);
payRequest.setBizModel(model);
//设置同步回调地址
payRequest.setReturnUrl(payInfo.get ( "return_url" ));
//设置异步回调地址
payRequest.setNotifyUrl(payInfo.get ( "notify_url" ));
String form = "";
try {
form = alipayClient.pageExecute(payRequest).getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
logger.error("支付宝生成表单出错:" + e.getMessage());
}
return form;
}
}
4.支付调用公共方法
/**
* 支付宝支付公共方法
*
* @author shaoying.c@adsl.cn
* @CreateDate 2017/7/19 16:28
**/
@Controller
public class AlipayCommonMethod extends BaseController {
InvokeInterface invoke = InvokeInterface.getInstance();
/**
* 支付宝支付
*
* @param request
* @param response
*/
@RequestMapping(value = "${adminPath}${frontPath}/alipayCommon")
public void alipay(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
String domain = request.getHeader("Host");//获取域名
String buyer = request.getParameter ( "buyer" );
String goodsName = request.getParameter ( "subject" );
String tradeId = request.getParameter("tradeId");
Map<String,String> alipayInfo = new HashMap<> ();
alipayInfo.put ( "appId", appId);//商户应用号
alipayInfo.put ( "partner", partner);//合作者ID
alipayInfo.put ( "private_key", private_key);//私钥
alipayInfo.put ( "aliPublicKey", aliPublicKey);//公钥
alipayInfo.put ( "tradeId", tradeId );//商户订单号
alipayInfo.put ( "subject", !"".equals (goodsName) ? goodsName :"" );//订单描述
alipayInfo.put ( "total_fee", String.valueOf ( (double)totalAmount/1000) );//订单价格
AbstractAlipay abstractAlipay = null;
//根据支付版本,判断调用1.0还是2.0,实例化不同对象
if ("10".equals ( alipayVersion )){
abstractAlipay = new Alipay ();
} else {
alipayInfo.put ( "notify_url", notify_url);
alipayInfo.put ( "return_url", return_url );
abstractAlipay = new Alipay2 ();
}
response.setContentType("text/html;charset=" + AlipayConfig2.CHARSET);
response.getWriter().write(abstractAlipay.pay ( alipayInfo ));//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
}
}
3.pom.xml
<dependency>
<groupId>alipay</groupId>
<artifactId>alipay-sdk</artifactId>
<version>${alipay.sdk.version}</version>
</dependency>