准备
注册支付宝,进入开放平台的沙箱环境,接入当面付功能。
期间需要设置支付宝公钥、应用公钥、应用私钥等,具体这些操作我就不多说了,可以自找资料。
当面付
下载Demo,然后进行测试。
在zfbinfo.properties
中主要配置这几项:
# 支付宝网关名、partnerId和appId
# 正式环境
# open_api_domain = https://openapi.alipay.com/gateway.do
# 沙箱环境
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
# 支付宝控制台查看appid,必填
pid =
appid =
# RSA私钥、公钥和支付宝公钥,必填
private_key =
public_key =
#SHA1withRsa对应支付宝公钥
#alipay_public_key =
#SHA256withRsa对应支付宝公钥,必填
alipay_public_key =
查询返回数据
返回AlipayF2FQueryResult
,里面包含TradeStatus
和AlipayTradeQueryResponse
,以下是AlipayTradeQueryResponse
的内容:
{
"alipay_trade_query_response": {
"code": "10000",
"msg": "Success",
"buyer_logon_id": "noh***@sandbox.com",
"buyer_pay_amount": "1.00",
"buyer_user_id": "2088102176549131",
"buyer_user_type": "PRIVATE",
"fund_bill_list": [{
"amount": "1.00",
"fund_channel": "ALIPAYACCOUNT"
}],
"invoice_amount": "1.00",
"out_trade_no": "48758867",
"point_amount": "0.00",
"receipt_amount": "1.00",
"send_pay_date": "2018-08-30 10:44:02",
"total_amount": "1.00",
"trade_no": "2018083021001004130500294377",
"trade_status": "TRADE_SUCCESS"
},
"sign": "****签名****"
}
回调数据处理
/**
* 将回调返回的信息转化为Map
* @param request
* @return
*/
public static Map<String, String> transferCallBackResultToMap(HttpServletRequest request){
Map<String,String> params = new HashMap<String,String>();
Map<String,String[]> 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] + ",";
}
params.put(name, valueStr);
}
return params;
}
接口示例
// 根据订单信息生成二维码
@RequestMapping("/getQCode")
public String getQCode(HttpServletRequest request, HttpSession session){...}
// 根据订单号查询
@RequestMapping("/query")
public String query(String outTradeNo, Map<String, Object> map){...}
// 根据订单号和退款参数进行退款
@RequestMapping("/refund")
public String refund(String outTradeNo, String refundAmount, String refundReason, String outRequestNo, String storeId, Map<String, Object> map){...}
// 扫码成功后进行支付宝回调
@PostMapping("/alipay_callback")
@ResponseBody
public String callback(HttpServletRequest request){...}
// 检测支付状态,进行扫码支付后跳转
@GetMapping("/checkPayResult")
@ResponseBody
public Map<String, String> checkPayResult(@RequestParam("outTradeNo") String outTradeNo){...}
测试
使用测试账号以及沙箱版支付宝进行测试。
所遇问题
1、支付宝公钥错误
com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail
检查支付宝公钥的加密方式,确保加密方式以及配置正确。
2、gson版本问题
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gsonBuilder' defined in class path resource [org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration.class]:
SpringBoot使用gson,版本问题,更新较新版本即可。
3、扫码支付后回调问题
- 在发送预支付(即生成二维码)时就设置回调URL,而不是在控制台设置,而且URL不能带有&等特殊符号
- 回调URL必须暴露在公网上,可使用natapp进行内网穿透
- 权限拦截问题,阻止了回调
- 使用POST方式接收