因为公司需求所以就去看了一下支付宝的支付接入,在这里记录一下,也为了加深一下印象。
首先需要进入到支付宝的开放平台根据文档配置好相应的配置。
配置依赖
com.alipay.sdk
alipay-sdk-java
4.9.9
下面就是下单的接口的代码,这里要说下最好是从数据库里面拿到你的订单信息。
有一些须要准备的参数
APPID(支付宝给的唯一id)、APP_PRIVATE_KEY(开发者秘钥通过支付宝的秘钥工具由开发者生成)、ALIPAY_PUBLIC_KEY(支付宝公钥,上传应用公钥支付宝生成的相应公钥)
public void alipay(Order order, HttpServletResponse response) {
//创建一个阿里支付的客户端,所有的支付、退款、查询等等相关的请求都是由这个对象发送的
AlipayClient alipayClient = new DefaultAlipayClient(
AlipayConfig.gatewayUrl,//支付宝的网关,https://openapi.alipay.com/gateway.do
AlipayConfig.app_id,//商户的appId
AlipayConfig.merchant_private_key,//开发者秘钥
"json",//参数返回格式,只支持JSON
AlipayConfig.charset,//编码格式
AlipayConfig.alipay_public_key,//支付宝公钥
AlipayConfig.sign_type //生成签名的加密类型
); //获得初始化的AlipayClient
//申请支付页面的请求对象
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
//设置同步返回的url - 用户支付完成后跳转到哪里页面 GET
alipayRequest.setReturnUrl("http://localhost:8080/login");
//设置异步返回的0url - 用户支付结果的通知url POST
alipayRequest.setNotifyUrl("http://localhost:8080/pay/alipaypayment");//在公共参数中设置回跳和通知地址
//支付请求体
alipayRequest.setBizContent("{" +
" \"out_trade_no\":\""+order.getOrderId()+"\"," + //订单号
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +//这个是销售产品码这个不用改
" \"total_amount\":"+order.getPrice().doubleValue()+"," +//订单价格
" \"subject\":\""+order.getSubject()+"\"," +//订单标题
" \"body\":\""+order.getBody()+"\"," +//订单内容
// " \"timeout_express\":\"3h\"," +//订单有效期
" \"extend_params\":{" +//业务扩展参数可甜可不填根据需要
" \"sys_service_provider_id\":\"2088511833207846\"" +
" }"+
" }");//填充业务参数
//生成支付的表单页面 - 一串HTML文本
String form="";
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
AlipayTradePagePayResponse alipayTradePagePayResponse = alipayClient.pageExecute(alipayRequest);
if(alipayTradePagePayResponse.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=UTF-8" );
try {
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
到这里支付宝的下单接口就完成了
这里说下我碰到的一些问题:
1、支付页面没有展示出来-----因为当时是用ajax异步直接请求支付接口的,但是因为异步会堵塞导致支付宝的页面不能异步跳转展示。(这个不知道是不是这样我是听别人说的),用form表单提交或者直接请求不通过异步是没有问题的。
2、进入之后报错
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
这是因为你的私钥格式错了,我是使用java是需要PKCS8格式的但是公司给的是PKCS1非java格式的,后面把格式转换成java适用的PKCS8就可以了
支付异步回调处理:https://blog.csdn.net/weixin_45589505/article/details/105009084