**
java对接支付宝实现支付功能
**
Controller
/**
* 支付功能
* @return
*/
@RequestMapping("/test")
public ModelAndView test(){
ModelAndView mv = new ModelAndView("test");
return mv;
}
/**
* 支付宝回调
* @param request
* @return
* @throws UnsupportedEncodingException
* @throws AlipayApiException
*/
@RequestMapping("/paySuccess")
@ResponseBody
public SuccessRequest paySuccess(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
SuccessRequest payQuery = new SuccessRequest();
Map<String,String> map = new HashMap<>();
map = PayUtil.paySuccess(request);
if(map!=null){
redisUtil.setStrKV("xxxx",1);
payQuery.setId(0);
payQuery.setKeyword("成功");
}
return payQuery;
}
/**
* 支付宝验签
* @param oid
* @param oname
* @param money
* @param desc
* @param model
* @return
* @throws AlipayApiException
*/
@RequestMapping("/pay")
@ResponseBody
public SuccessRequest pay(String oid,String oname,String money,String desc,Model model) throws AlipayApiException {
SuccessRequest payQuery = new SuccessRequest();
payQuery = PayUtil.payQuery(oid);
if(payQuery.getId().equals(0)){
payQuery = PayUtil.pay(oid,oname,money,desc);
}else if(payQuery.getId().equals(2)){
redisUtil.setStrKV("xxxx",1);
}
System.out.println(payQuery);
return payQuery;
}
Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SuccessRequest implements Serializable {
private Integer id;
private String keyword;
private String callback;
}
支付util
我的这个付款验签需要用的是应用公钥、查询支付信息用的是支付宝公钥验签(不明白为什么,如果不这样就会报验签错误)
//网关
final static String serverUrl = “https://openapi.alipaydev.com/gateway.do”;
//appid
final static String appId = “”;
//私钥
final static String privateKey = “”;
//支付宝公钥
final static String ali_key="";
//应用公钥
final static String ali_keyyingyong = “”;
final static String signType = “RSA2”;
/**
* 付款
*
* @param oid
* @param oname
* @param money
* @param desc
* @return
* @throws AlipayApiException
*/
public static SuccessRequest pay(String oid, String oname, String money, String desc) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
serverUrl,
appId,
privateKey,
format,
charset,
ali_keyyingyong,
signType
);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl("http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp");
//returnUrl
request.setReturnUrl("http://localhost:1234/paySuccess");
JSONObject bizContent = new JSONObject();
//商品信息
//商品id
bizContent.put("out_trade_no", oid);
//价格
bizContent.put("total_amount", money);
//名称
bizContent.put("subject", oname);
//备注
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = alipayClient.sdkExecute(request);
//3、请求支付宝进行付款,并获取支付结果
String result = alipayClient.pageExecute(request).getBody();
System.out.println(result);
SuccessRequest successRequest = new SuccessRequest();
if (response.isSuccess()) {
successRequest.setId(0);
successRequest.setKeyword("调用成功");
successRequest.setCallback(result);
} else {
System.out.println("调用失败");
successRequest.setId(1);
successRequest.setKeyword("调用失败");
}
return successRequest;
}
/**
* 查询是否支付
* @param oid
* @return
* @throws AlipayApiException
*/
public static SuccessRequest payQuery(String oid) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
serverUrl,
appId,
privateKey,
format,
charset,
ali_key,
signType
);
SuccessRequest successRequest = new SuccessRequest();
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
//商户订单号,商户网站订单系统中唯一订单号
String out_trade_no = oid;
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"}");
AlipayTradeQueryResponse response = alipayClient.execute(alipayRequest);
String tradeStatus = response.getTradeStatus();
if(tradeStatus!=null&&tradeStatus.equals("TRADE_SUCCESS")){
successRequest.setId(2);
successRequest.setKeyword("用户已支付");
System.out.println("用户已支付");
}else{
successRequest.setId(0);
successRequest.setKeyword("用户未支付");
System.out.println("用户未支付");
}
return successRequest;
}
/**
* 支付成功回调
* @param request
* @return
* @throws AlipayApiException
*/
public static Map<String,String> paySuccess(HttpServletRequest request) throws AlipayApiException {
//获取支付成功订单id,获取成功的状态
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] + ",";
}
params.put(name, valueStr);
}
SuccessRequest successRequest = new SuccessRequest();
String out_trade_no = params.get("out_trade_no");
String trade_no = params.get("trade_no");
String total_amount = params.get("total_amount");
System.out.println("out_trade_no==="+out_trade_no);
System.out.println("trade_no==="+trade_no);
System.out.println("total_amount==="+total_amount);
successRequest.setId(0);
successRequest.setKeyword("验签成功");
return params;
}
填写支付信息页面
订单id<input type="text" name = "oid" id = "oid"/>
订单名称<input type="text" name = "oname" id = "oname"/>
付款金额<input type="text" name = "money" id = "money"/>
描述<input type="text" name = "desc" id = "desc"/>
<input type="button" value="付款" onclick="pay()">
脚本
function pay() {
var oid = $("#oid").val();
var oname = $("#oname").val();
var money = $("#money").val();
var desc = $("#desc").val();
$.post("pay",{oid:oid,oname:oname,money:money,desc:desc},function (data) {
console.info(data);
if(data.id==0){
$("#div").append(data.callback);
}else if(data.id==1){
$("#div").append("验签失败");
console.info("验签失败");
}else if(data.id==2){
$("#div").append("用户已支付");
console.info("用户已支付");
}
});
}
备注
该代码属于沙箱环境下完成测试,改为正式的支付,只需把网关换成https://openapi.alipay.com/gateway.do