支付宝APP支付Java服务端

hushijiao 2018-08-16

这里对于设置支付宝账号和配置就不做说明,网上很多配置信息和应用上线的文章

做第三方接口首先得看官方文档,支付宝的官方文档非常清晰:

支付宝APP支付Java服务端

首先登录支付宝的开放文档,下载支付宝SDK和demo,链接:

https://docs.open.alipay.com/54/106370/

将jar包导入项目,在Java服务端生成订单信息:

//实例化客户端

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");

//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。

AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();

model.setBody("我是测试数据");

model.setSubject("App支付测试Java");

model.setOutTradeNo(outtradeno);//更换为自己的订单编号

model.setTimeoutExpress("30m");

model.setTotalAmount("0.01");//订单价格

model.setProductCode("QUICK_MSECURITY_PAY");

request.setBizModel(model);

request.setNotifyUrl("商户外网可以访问的异步地址");//回调地址不可以带参数

String orderStr = "";

try {

//这里和普通的接口调用不同,使用的是sdkExecute

AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

orderStr = response.getBody();

System.out.println(orderStr);//就是orderString 可以直接给客户端请求,无需再做处理。

} catch (AlipayApiException e) {

e.printStackTrace();

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

说的简直太详细,只需要替换自己的订单ID和价格就可以了,这里我们只需要把orderStr返回给客户端就可以了,我是通过json返回的,当然客户端完成支付之后,服务端还需要知道支付结果,或者将支付的订单信息存入数据库,那么我们需要设置回调地址,即setNotifyUrl,支付宝服务端通过这个地址将支付结果返回给后台服务端,在这里我们可以更改订单状态,插入订单信息等等。(注:这个的回调地址必须是外网可以访问的,不然收不到支付宝返回的信息,这个地址即我们在开发配置中设置的授权回调地址)

支付宝APP支付Java服务端

回调页面内容严格按照支付宝规定:

<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>

<%@page import="com.alipay.api.internal.util.AlipaySignature"%>

<%@ page import="java.util.*"%>

<%@ page import="java.util.Map"%>

<%@ page import="com.alipay.*"%>

<%@ page import="com.alipay.api.*"%>

<%

//获取支付宝POST过来反馈信息

Map<String,String> params = new HashMap<String,String>();

System.out.println("异步通知参数:");

Map<String,String[]> requestParams = request.getParameterMap();

for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {

String name = (String) iter.next();

String[] values = (String[]) requestParams.get(name);

String valueStr = "";

for (int i = 0; i < values.length; i++) {

valueStr = (i == values.length - 1) ? valueStr + values[i]

: valueStr + values[i] + ",";

}

if(name.equals("trade_status")){

System.out.println("交易状态为:"+valueStr);

}

//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化

//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");

params.put(name, valueStr);

}

System.out.println("params"+params);

String pk = "自己的支付宝公钥";

//获取支付宝的通知返回参数

//商户订单号

String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

//支付宝交易号

String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

//客户订单编号

String auth_app_id = new String(request.getParameter("auth_app_id").getBytes("ISO-8859-1"),"UTF-8");

//买家登录支付宝id

String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"),"UTF-8");

//交易时间

String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"),"UTF-8");

//交易金额

String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"),"UTF-8");

boolean verify_result = AlipaySignature.rsaCheckV1(params,pk, "UTF-8", "RSA2");

//这里可以做处理修改订单状态

if(verify_result){//验证成功

//支付成功只需要返回success

System.out.println(1);

out.println("success"); //请不要修改或删除

}else{//验证失败

System.out.println(2);

out.println("fail");

}

%>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

需要修改订单状态时在回调页面根据out_trade_no改变订单状态就可以。

相关推荐