支付宝——PC端支付
- 首先登录蚂蚁金服开放平台,入驻选择自由研发的这些就不说了,注册下信息就可以了。
- 在开发者中心,开放者接入进行创建应用,添加功能等操作
创建完对应的应用后,去应用列表添加电脑网站支付的功能
签约是需要额外的一些信息的,填写一下就可以了 - 这时候,我们点击电脑网站支付,可以直接来到 开发文档的页面,我们可以按照这个文档一步步的照做。
直接来到快速接入的里面,先进行配置密钥的操作。
直接进入到这个网址配密钥:生成RSA密钥,下载对应系统的密钥工具,解压之后按照开发文档里面的操作点击生成密钥即可,生成的密钥会保存RSA工具的目录下
ps:每次点击生成密钥都会覆盖原先的密钥,一公钥对应一私钥,一定要保存好。忘记的话就重新设置公钥吧。
现在我们将密钥全部配置完毕,来到开放平台密钥页面,这里还有你的APPID。
点击设置应用公钥,验证手机号后,将我们生成的公钥复制进去,这时候密钥已经配置成功了。
如果还想验证公钥的话,下载官方的工具,将应用私钥输入到工具里面,在将工具返回的字符串输入到弹出网页那里,成功则一切正常了。
支付宝公钥在配置完应用公钥后就可以查看了
ps:对于公钥,私钥,appid等信息,我们可以先使用蚂蚁提供的 电脑支付DEMO配合沙箱进行配置测试,看一看是否配置成功了
沙箱:开放平台—沙箱环境 - 开发环境就不说了,jdk之类的
- 关键参数:下面这些是必要的了
- 代码中的体现:
阿里提供的三方jar包是不能忘记的:三方jar包
基础配置类:
public class AlipayConfig {
// 支付宝网关(固定)
// "https://openapi.alipaydev.com/gateway.do";//沙箱网关
public static final String GATEWAYURL = "https://openapi.alipay.com/gateway.do";
// APPID 即创建应用后生成
// public static final String APPID = "2016092100564910";//沙箱
// 开发者私钥,由开发者自己生成
public static final String APP_PRIVATE_KEY = "xxx";
// 参数返回格式,只支持json
public static final String FORMAT = "json";
// 参数返回格式,只支持json
public static final String CHARSET = "UTF-8";
// 支付宝公钥,由支付宝生成
public static final String ALIPAY_PUBLIC_KEY = "xxx";
// 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
public static final String SIGN_TYPE = "RSA2";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外 网可以正常访问
public static final String NOTIFY_URL = "http://公网地址";
// 同步返回地址,HTTP/HTTPS开头字符串,非必填
public static final String RETURN_URL = "http://公网地址";
public static final String TimeoutExpress = "1m";// 交易的过期时间,要与redis的二维码同步的
}
AlipayManger工具类:
/**
* @Description:电脑网站支付
* @author
*/
public class AlipayManger {
/**
* alipayClient只需要初始化一次,后续调用不同的API都可以使用同一个alipayClient对象。
*/
private static volatile AlipayManger instance;
private static volatile AlipayClient alipayClient;
private AlipayManger() {
alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAYURL, AlipayConfig.APPID,
AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGN_TYPE);
}
public static AlipayManger getInstance() {
if (instance == null) {
synchronized (AlipayManger.class) {
if (instance == null) {
instance = new AlipayManger();
}
}
}
return instance;
}
/**
* 支付页面:支付操作
*
* @param out_trade_no 订单号
* @param total_amount 支付总金额
* @param subject 商品名称
* @return
* @throws AlipayApiException
*/
public AlipayTradePagePayResponse TradePagePay(String out_trade_no, Double total_amount, String subject) {
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
AlipayTradePagePayModel model = new AlipayTradePagePayModel();//用来封装参数的一个类
model.setOutTradeNo(out_trade_no);
model.setTotalAmount(String.valueOf(total_amount));
model.setSubject(subject);
model.setProductCode("FAST_INSTANT_TRADE_PAY");
model.setTimeoutExpress(AlipayConfig.TimeoutExpress);
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.NOTIFY_URL);//设置-异步通知页面
request.setReturnUrl(AlipayConfig.RETURN_URL);//设置-支付成功后同步跳转到哪个页面
AlipayTradePagePayResponse response = null;
try {
response = alipayClient.pageExecute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
}
/**
* 统一订单查询接口
*
* @param out_trade_no 订单号
* @return
* @throws AlipayApiException
*/
public AlipayTradeQueryResponse TradePayQuery(String out_trade_no) {
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo(out_trade_no);
request.setBizModel(model);
AlipayTradeQueryResponse response = null;
try {
response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
}
/**
* 基本退款接口
*
* @param out_trade_no 订单号
* @param refundAmount 退款金额
* @param refundReason 退款理由
* @return
*/
public AlipayTradeRefundResponse TradeRefund(String out_trade_no, String refundAmount, String refundReason) {
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
model.setOutTradeNo(out_trade_no);
model.setRefundAmount(refundAmount);
model.setRefundReason(refundReason);
request.setBizModel(model);
AlipayTradeRefundResponse response = null;
try {
response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
}
/**
* 商户的退款查询接口
*
* @param out_trade_no 订单号
* @param out_request_no 部分退款传参
* @return
*/
public AlipayTradeFastpayRefundQueryResponse TradeFastpayRefundQuery(String out_trade_no, String out_request_no) {
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
model.setOutTradeNo(out_trade_no);
boolean flag = StringUtils.isEmpty(out_request_no);
model.setOutRequestNo(flag ? out_trade_no : out_request_no);
request.setBizModel(model);
AlipayTradeFastpayRefundQueryResponse response = null;
try {
response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
}
/**
* 支付宝服务器异步通知
* 此处要当成一个接口可以通过url进行访问,并且只有放到公网上,
* 在支付里面配置了request.setNotifyUrl(AlipayConfig.NOTIFY_URL
* 程序支付成功后才会异步处理,失败和订单超时不会进行异步的
*
* @param request
* @throws UnsupportedEncodingException
*/
public void NotifyUrl(HttpServletRequest request) throws UnsupportedEncodingException {
Map<String, String> params = new HashMap<String, String>();
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] + ",";
}
// 乱码解决,这段代码在出现乱码时使用
try {
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
params.put(name, valueStr);
}
boolean signVerified = false;
try {
signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
AlipayConfig.SIGN_TYPE);
} catch (AlipayApiException e) {
e.printStackTrace();
} // 调用SDK验证签名
if (signVerified) {// 验证成功,进行业务逻辑的处理
// 商户订单号
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 trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
if (trade_status.equals("TRADE_SUCCESS")) {
/**
* 返回的状态是success,接下来可以:更改订单支付成功状态,设置支付信息,等等业务处理……
*/
System.out.println("success");
} else {
/**
* fail 的业务处理:……
*/
System.out.println("fail");
}
}
}
/**
* 对于支付宝同步跳转页面(return_url),里面的代码和异步的是一样的
* 我们可以在同步页面中拿到支付宝给你返回的订单信息,然后写个接口,将数据返给前端,让前端进行展示
*/
}
ServiceImpl层的使用:
@Service
public class OrderPayServiceImpl implements OrderPayService {
static AlipayManger instance = AlipayManger.getInstance();//获取我们封装的 支付实例
/**
* ali电脑支付,前端调用这个接口,将body展示到页面上,就可以跳到支付宝三方到页面上了
*/
@Override
public String aliPayTradePay(String name, String orderNo, Double price) {
AlipayTradePagePayResponse response = instance.TradePagePay(orderNo, price, name);
// payCacheImpl.setQrCodeExp(response.getBody(), orderNo,
// AlipayConfig.TimeoutExpress, 1);
System.out.println(response.getBody());
orderOverTime(orderNo, price, AlipayConfig.TimeoutExpress);// 订单超时未付款处理
return response.getBody();//是form表单,我们最终需要的二维码数据
}
}
以上的这些功能可以完成基础的支付宝电脑支付的功能了,具体的代码还是要看业务的流程的,若还需要其他的功能,去蚂蚁提供的开发平台查看吧 电脑网站支付文档 这里面还有API,DEMO,错误处理等等……,剩下的只能看大家的了,写的不好还请见谅 ^ - ^