无论在web开发、移动开发中,使用支付宝支付是必不可少的技能,本文将收集本人在开发中遇到的问题,也可以加入交流群244284555 和博主进行沟通
创建支付宝应用前提必须使用企业认证的支付宝账号,否则将无法创建应用
登录后进入开发者中心选择网页移动应用
选择支付接入
创建好应用后,需开通签约app支付或者网页支付功能,根据开发需求选择签约,这里会收取手续费,按每笔交易收取不同比例费用,提交后需等待审核完成,这个阶段使用支付功能将会报insufficient-isv-permissions错误。遇到此错误等待审核通过即可
上传支付宝秘钥,下载地址:https://docs.open.alipay.com/291/105971
下载好后打开这个文件:
生成成功打开rsa_private_key_pkcs8.pem这个文件,进行应用公钥的上传,会自动生成支付宝公钥。
此时设置加密方式:如果没有设置加密方式,你将会遇到app支付成功后,接口并不会调用回调函数,这个地方一定要注意
接下来进入编码阶段:
/**
* 支付宝支付配置
*/
public class AlipayConfig {
// 商户appid
public static String APP_ID = "";
// 支付宝公钥
public static String ALIPAY_PUBLIC_KEY = "";
//应用私钥
public static String APP_PRIVATE_KEY = "";
/**
* 5.服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
*/
public static String notify_url = "http://www.xxx.com/alipay/notify_url.do";
/**
* 6.请求网关地址
*/
public static String URL = "https://openapi.alipay.com/gateway.do";
/**
* 7.编码
*/
public static String CHARSET = "UTF-8";
/**
* 8.返回格式
*/
public static String FORMAT = "json";
/**
* 9.加密类型
*/
public static String SIGNTYPE = "RSA2";
/**
* 10.订单有效日期
*/
public static String TIMEOUT_EXPRESS = "7d";
public static String PRODUCT_CODE = "QUICK_MSECURITY_PAY";
/**
* 支付回调接口&充值余额支付回调接口
* 支付回调地址只有一个
*/
public static String NOTIFY_URL = "";
/**
* 获取订单号的 key
*/
public static String OUT_TRADE_NO = "out_trade_no";
/**
* 获取交易状态码的 key
*/
public static String TRADE_STATUS = "trade_status";
/**
* 字符常量 “TRADE_SUCCESS”
*/
public static String TRADE_SUCCESS = "TRADE_SUCCESS";
/**
* 字符常量 “TRADE_FINISHED”
*/
public static String TRADE_FINISHED = "TRADE_FINISHED";
/**
* 字符常量 “app_id”
*/
public static String APP_ID_NOTIFY = "app_id";
/**
* 字符常量 “total_amount”
*/
public static String TOTAL_AMOUNT_NOTIFY = "total_amount";
/**
* 字符常量 “total_amount”
*/
public static String SELLER_EMAIL_NOTIFY = "seller_email";
/**
* 字符常量 “元”
*/
public static String YUAN = "元";
}
@RequestMapping(value="/alipay", method={RequestMethod.POST})
public Result alipay(@Valid OrderAlipayReq orderAlipayReq, HttpSession session,HttpServletRequest httpRequest){
Result result = new Result();
if(orderAlipayReq.getOrderId()==null){
logger.info("参数订单号OrderId为空");
result.setCode(MessageContants.FAIL);
result.setMessage("参数订单号OrderId为空");
return result;
}
if(orderAlipayReq.getPrice()==null){
logger.info("参数订单号Price为空");
result.setCode(MessageContants.FAIL);
result.setMessage("参数订单号Price为空");
return result;
}
MwOrder mwOrder = mwOrderRepository.findOne(orderAlipayReq.getOrderId());
if(mwOrder==null){
logger.info("根据OrderId查询订单信息为空,此订单不存在");
result.setMessage("此订单不存在"+orderAlipayReq.getOrderId());
result.setCode(MessageContants.FAIL);
return result;
}
//订单ID 商品名称 价格
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APP_ID,
AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGNTYPE);
/**
* 创建web请求消息
*/
// AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
/**
* 创建app请求消息
*/
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
/**
* 封装业务参数
* SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
*/
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
String subject = orderAlipayReq.getMediaName();
String orderNo = mwOrder.getOrderNo();
String body = mwOrder.getOrderName();
/**
* 查询订单信息
*/
// 支付订单详情
model.setBody(body);
// 支付订单标题
model.setSubject(subject);
// 支付订单编号
model.setOutTradeNo(orderNo);
// 订单超时时间
model.setTimeoutExpress(AlipayConfig.TIMEOUT_EXPRESS);
// 支付订单金额
model.setTotalAmount("0.01");
// model.setTotalAmount(createOrder.getTotalAmount());
// 订单代码
model.setProductCode(AlipayConfig.PRODUCT_CODE);
request.setBizModel(model);
logger.info("发起支付宝app成功,开始回调");
//支付成功了,把订单编号缓存
// session.setAttribute("orderId",mwOrder.getOrderId());
// 回调地址
request.setNotifyUrl(AlipayConfig.NOTIFY_URL);
/**
* 支付宝响应体
*/
AlipayTradeAppPayResponse response = null;
//这里和普通的接口调用不同,使用的是sdkExecute
try {
response = alipayClient.sdkExecute(request);
//处理支付后订单信息,上线后需放在回调接口中
/*
mwOrder.setOrderId(mwOrder.getOrderId());
//支付成功 "1",更新时间
//未支付状态
mwOrder.setStatus("0");
mwOrder.setMediaOrderStatus("5");
mwOrder.setUpdateTime(DateUtils.getNowDate());
mwOrderRepository.save(mwOrder);
*/
//支付后向账单表里添加记录
/* MwBill mwBill = new MwBill();
mwBill.setBillDescribe("支付宝消费"+orderAlipayReq.getPrice());
mwBill.setConsumeAmount("0.01");
mwBill.setConsumeTime(DateUtils.getNowDate());
mwBill.setUserId(mwOrder.getUserId());
mwBillRepository.save(mwBill);*/
} catch (AlipayApiException e) {
//如果回调失败了
logger.info("支付失败");
result.setCode(MessageContants.FAIL);
result.setMessage("支付失败");
logger.info(response.getBody());
result.setData(response.getBody());
e.printStackTrace();
return result;
}
logger.info("支付宝响应内容:{}",response.getBody());
result.setData(response.getBody());
result.setMessage("支付成功");
result.setCode(MessageContants.SUCCESS);
return result;
}
只要账号信息无误,就能完成支付宝支付