一定要去下载最新的demo里面包含的sdk包(我下载的2月份的的包,3月份用的时候,出现了一个问题,在支付时,取消支付,直接把我的服务端搞死[还没去研究],后来换成最新包就好了),这是我遇到的尴尬问题
支付只需要检查几个点就可以很容易实现:
1. 你要选择的是app支付,还是wap支付等等;
2. 你的配置是否正确,即面的配置类,里面的参数一定要正确, 有可能你的会出现乱码,请检查INPUT_CHARSET这个参数(编码格式);
3. AliPay类中,需要注意你产生的业务订单号, 订单号重复提交,支付宝会提示你请勿重新提交;
4. 关于异步回调,一定要外网能访问的到的,我的sing_type是RSA使用AlipaySignature.rsaCheckV1验签,不要用AlipaySignature.rsaCheckV2;
以下是代码:
[记录一下中间遇到的问题]
这是AliPayConfig配置类:
/**
* Created by Administrator.
* Created on 2018/3/27.
* Description: 支付宝配置类
*/
public class AliPayConfig {
// 合作身份者ID,以2088开头由16位纯数字组成的字符串, 商户ID
public static String PARTNER = "你的partner";
// 请求网关地址
// public static String SERVICE_URL = "https://openapi.alipaydev.com/gateway.do"; // 测试网关
public static String SERVICE_URL = "https://openapi.alipay.com/gateway.do"; // 正式网关
//固定值
public static String SERVICE = "mobile.securitypay.pay";
public static String SELLER_ID = "*******@163.com";
//私钥
public static String PRIVATE_KEY = "你的私钥串";
// 支付宝的公钥,无需修改该值(不要删除也不要修改,在接收通知的时候需要进行签名认证)
public static String ALI_PUBLIC_KEY = "这个是支付宝公钥";
// 商户的公钥钥
public static String PUBLIC_KEY = "这个是应用公钥";
// 字符编码格式 目前支持 GBK 或 UTF-8
public static String INPUT_CHARSET = "UTF-8";
// 签名方式 不需修改[我用的是RSA]
public static String SIGN_TYPE = "RSA";
//APPID
public static String APPID = "你的appid";
// 支付宝回调地址,需要外网能访问的地址
public static String NOTIFY_URL = "http://你的域名或服务器ip/pay/alipay/notify";
// 返回格式
public static String FORMAT = "JSON";
}
这是支付调用类:
/**
* Created by Administrator.
* Created on 2018/3/27.
* Description: 支付宝支付
*/
@RestController
public class AliPay {
private static final Logger logger = LoggerFactory.getLogger(AliPay.class);
public String aliPay(Map<String, Object> params) {
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.SERVICE_URL, AliPayConfig.APPID,
AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.INPUT_CHARSET, AliPayConfig.ALI_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(params.toString())); //描述信息 添加附加数据
model.setSubject(params.get("subject").toString()); //商品标题
model.setOutTradeNo(params.get("orderId").toString()); //商家订单编号(我使用(订单号+时间戳:流水号))
model.setTimeoutExpress("30m"); //超时关闭该订单时间
model.setTotalAmount(params.get("amount").toString()); //订单总金额
model.setProductCode("QUICK_MSECURITY_PAY"); //销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
model.setSellerId(AliPayConfig.PARTNER); // 商家id
request.setBizModel(model);
request.setNotifyUrl(AliPayConfig.NOTIFY_URL); //回调地址
String orderStr = "";
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); //这里和普通的接口调用不同,使用的是sdkExecute
orderStr = response.getBody();
logger.info("=======>>>>>这是orderStr:" + orderStr); // 就是orderString 可以直接给客户端请求,无需再做处理。
} catch (AlipayApiException e) {
e.printStackTrace();
}
return orderStr;
}
@ResponseBody
@RequestMapping(value = "/pay/alipay/notify", method={RequestMethod.POST,RequestMethod.GET}, produces="application/json;charset=utf-8")
public String aliPay_notify(HttpServletRequest request) {
Map requestParams = request.getParameterMap();
logger.info("==============支付宝异步回调==============");
//获取支付宝POST过来反馈信息
Map<String, String> params = new HashMap<String, String>();
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
logger.info("===>>>支付宝异步回调参数:" + params);
// 2.封装必须参数
String out_trade_no = request.getParameter("out_trade_no"); // 商户订单号
logger.info("out_trade_no===>>>" + out_trade_no);
String orderType = request.getParameter("body"); // 订单内容
logger.info("orderType===>>>" + orderType);
String tradeStatus = request.getParameter("trade_status"); // 交易状态
logger.info("tradeStatus===>>>" + tradeStatus);
try {
// 3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
//验证签名, 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.INPUT_CHARSET, AliPayConfig.SIGN_TYPE);
if (flag) {
if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
//附加数据
// String passback_params = URLDecoder.decode(params.get("passback_params"));
/**
这里实现你的订单更新操作
*/
return "success";
} else {
return "fail";
}
} else {
logger.info("支付宝异步回调签名错误");
return "fail";
}
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
logger.info("======>>>这是支付宝异步回调异常:");
e.printStackTrace();
}
return "fail";
}
}
好了, 暂时支付宝java服务端开发遇到的一些问题, 多看看官方文档[App支付服务端文档]
如果遇到问题,最好去咨询技术客服,他们很给力的,给他们点赞.