支付宝APP支付接口-Java服务端
官方文档
设置支付宝账户有关参数
接口功能:外部商户App唤起快捷SDK创建订单并支付。
public class AlipayConfig {
public static final String COMMODITY_SUBJECT = "";//商品的标题
/**
* 支付宝网关(固定)
*/
public static final String URL = "https://openapi.alipay.com/gateway.do";
/**
* APPID即创建应用后生成
*/
public static String APP_ID = "";
/**
* 开发者应用私钥,由开发者自己生成
*/
public static final String APP_PRIVATE_KEY = "XXX";//设置成自己,也可以需改为可配置的
/**
* 参数返回格式,只支持json
*/
public static final String FORMAT = "json";
/**
* 请求和签名使用的字符编码格式,支持GBK和UTF-8
*/
public static final String CHARSET = "UTF-8";
/**
* 支付宝公钥,由支付宝生成
*/
public static String ALIPAY_PUBLIC_KEY = "";
/**
* 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
*/
public static final String SIGN_TYPE = "RSA2";
/**
* 支付宝异步通知地址
*/
public static String ALIPAY_NOTIFY_URL = "";
/**
* 支付超时时间
*/
public static String TIMEOUT_EXPRESS = "";
/**
* 可支付的渠道
*/
public static String ENABLE_PAY_CHANNELS = "";
static {
/**
* 设置配置项,具体请重写
*/
Configuration conf = null;
PathUtil pathUtil = new PathUtil();
try {
conf = new Configuration(pathUtil.getWebRoot() + "/WEB-INF/classes/sysconfig.properties");
ALIPAY_NOTIFY_URL = conf.getValue("alipay_notify_url")==null?"":conf.getValue("alipay_notify_url");
TIMEOUT_EXPRESS = conf.getValue("timeout_express")==null?"":conf.getValue("timeout_express");
ENABLE_PAY_CHANNELS = conf.getValue("enable_pay_channels")==null?"":conf.getValue("enable_pay_channels");
APP_ID = conf.getValue("appid")==null?"":conf.getValue("appid");
FileReader fr;
BufferedReader bufr = null;
try {
fr = new FileReader(pathUtil.getWebRoot()+"/WEB-INF/classes/alipay_public_key.txt");
bufr = new BufferedReader(fr);
ALIPAY_PUBLIC_KEY = bufr.readLine();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(bufr != null){
try {
bufr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
*/
public static final String PRODUCT_CODE = "QUICK_MSECURITY_PAY";
}
获取签名后订单信息
/**
* 生成APP支付订单信息
* @param amount 总金额
* @param body 商品描述
* @param outTradeNo 订单编码
* @return
*/
public String aliPay(String amount, String body, String outTradeNo) {
// 实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL,
AlipayConfig.APP_ID, AlipayConfig.APP_PRIVATE_KEY,
AlipayConfig.FORMAT, AlipayConfig.CHARSET,
AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE);
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setPassbackParams(URLEncoder.encode(body)); // 描述信息 添加附加数据
model.setSubject(AlipayConfig.COMMODITY_SUBJECT); // 商品标题
model.setOutTradeNo(outTradeNo); // 商家订单编号(13位时间戳+4位认证人员信息表id后四位,不足前面补0)
model.setTimeoutExpress(AlipayConfig.TIMEOUT_EXPRESS); // 超时关闭该订单时间
model.setTotalAmount(amount); // 订单总金额
model.setProductCode(AlipayConfig.PRODUCT_CODE); // 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
model.setEnablePayChannels(AlipayConfig.ENABLE_PAY_CHANNELS);
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.ALIPAY_NOTIFY_URL); // 回调地址
String orderStr = "";
try {
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient
.sdkExecute(request);
orderStr = response.getBody();
System.out.println(orderStr);// 就是orderString 可以直接给客户端请求,无需再做处理。
} catch (AlipayApiException e) {
e.printStackTrace();
}
return orderStr;
}
支付宝支付同步通知
由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。
忽略该接口
支付宝异步通知
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
/**
* 支付宝异步通知
* @author bin
*
*/
@Controller
public class AlipayAsynchronousNotificationREQ {
Logger logger = Logger.getLogger(AlipayAsynchronousNotificationREQ.class);
@Transactional(rollbackFor = Exception.class)
@RequestMapping("/getAsynchronousNotificationREQ")
public void getAsynchronousNotificationREQ(HttpServletRequest request,
HttpServletResponse response) throws AlipayApiException,
IOException {
PrintWriter out = response.getWriter();
// 获取支付宝POST过来反馈信息
logger.debug("支付宝异步回调");
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
for (Iterator 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] + ",";
logger.debug(valueStr);
}
// 乱码解决,这段代码在出现乱码时使用。
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean flag = AlipaySignature.rsaCheckV1(params,
AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
AlipayConfig.SIGN_TYPE);
if (flag) {
if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
// 订单金额
String amount = params.get("total_amount");
// 商户订单号
String out_trade_no = params.get("out_trade_no");
// 支付宝交易号
String trade_no = params.get("trade_no");
// 买家支付宝用户号
String buyer_id = params.get("buyer_id");
// 交易创建时间 格式为yyyy-MM-dd HH:mm:ss
String gmt_create = params.get("gmt_create");
// ...
// 添加自己的业务逻辑,如记录交易成功,支付宝返回的信息
// ...
out.print("success");
logger.debug("-----支付宝异步通知成功----");
} else {
logger.debug("-----支付宝异步通知,订单未成功付款----");
out.print("failure");
}
} else {
logger.debug("-----支付宝异步通知,订单验证错误----");
out.print("failure");
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:支付宝APP支付接口-Java服务端
文章字数:1.4k
本文作者:Bin
发布时间:2017-05-27, 22:28:27
最后更新:2019-08-06, 00:49:12
原始链接:http://coolview.github.io/2017/05/27/%E6%94%AF%E4%BB%98%E5%AE%9DAPP%E6%94%AF%E4%BB%98%E6%8E%A5%E5%8F%A3-Java%E6%9C%8D%E5%8A%A1%E7%AB%AF/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。