齐鲁都市网
您的位置:齐鲁都市网首页 > 资讯 > 正文

java 集成支付宝App支付

java  集成支付宝App支付

1.集成支付宝sdk


com.alipay.sdk
alipay-sdk-java
3.7.26.ALL

2.创建一个辅助类,生成支付宝支付签名与验证签名

package com.demo.test.utils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
public class AlipayUtils{
//请求网关地址
private static final String GATEWAY_URL="https://openapi.alipay.com/gateway.do";
//appid
private static final String APP_ID="创建的应用id";
//应用私钥pkcs8
private static final String APP_PRIVATE_KEY="应用私钥";
//支付宝公钥
private static final String ALIPAY_PUBLIC_KEY="支付宝公钥";//支付宝公钥
/**
*支付宝订单生成
*@paramorderno订单号
*@paramtitle商品名称
*@paramdesc商品描述
*@parampaymoney支付金额
*@paramnotifyUrl回调地址
*@return
*/
public String getOrderSignString(String orderno,String title,String desc,String paymoney,String notifyUrl){
//实例化客户端
AlipayClientali payClient=new DefaultAlipayClient(GATEWAY_URL,APP_ID,APP_PRIVATE_KEY,"json","UTF-8",ALIPAY_PUBLIC_KEY,"RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request=new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model=new AlipayTradeAppPayModel();
model.setBody(desc);
model.setSubject(title);
model.setOutTradeNo(orderno);
model.setTimeoutExpress("30m");
model.setTotalAmount(paymoney);
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(notifyUrl);
try{
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response=alipayClient.sdkExecute(request);
//System.out.println(response.getBody());//就是orderString可以直接给客户端请求,无需再做处理。
return response.getBody();
}catch(AlipayApiExceptione){
e.printStackTrace();
System.out.print("生成签名异常:"+e.getErrMsg());
}catch(Exceptionex){
ex.printStackTrace();
System.out.print("生成签名异常01:"+ex.getMessage());
}
return"";
}
public boolean verifySign(Map requestParams){
try{
//获取支付宝POST过来反馈信息
Map params=new HashMap();
//MaprequestParams=request.getParameterMap();
for(Iteratoriter=requestParams.keySet().iterator();iter.hasNext();){
Stringname=(String)iter.next();
String[]values=(String[])requestParams.get(name);
StringvalueStr="";
for(inti=0;i valueStr=(i==values.length-1)?valueStr+values[i]
:valueStr+values[i]+",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr=newString(valueStr.getBytes("ISO-8859-1"),"utf-8");
params.put(name,valueStr);
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//booleanAlipaySignature.rsaCheckV1(Mapparams,StringpublicKey,Stringcharset,Stringsign_type)
booleanflag=AlipaySignature.rsaCheckV1(params,ALIPAY_PUBLIC_KEY,"UTF-8","RSA2");

returnflag;
}catch(Exceptione){
e.printStackTrace();
returnfalse;

}

}
}

3.测试生成支付签名,调用支付宝

AlipayUtils alipay=new AlipayUtils();
String payInfo=alipay.getOrderSignString("20191351245451","充值10元","钱包充值","10","http://localhost:8080/notify/alipay");

获取的payInfo值可以app端调用支付宝进行支付

4.支付宝回调验证

package com.demo.test.controller;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.demo.test.utils.AlipayUtils;
//支付宝回调
@RestController
@RequestMapping("/notify")
public class AlipayNotifyController{

private static final Logger log=LoggerFactory.getLogger(AlipayNotifyController.class);

@Resource
private HttpServletRequest request;


@ResponseBody
@RequestMapping(value="/alipay",method=RequestMethod.POST,produces=MediaType.TEXT_PLAIN_VALUE)
public String notify(@RequestBody String requestStr,@RequestParam Map params){
try{
log.info("支付宝回调请求内容:"+requestStr);
AlipayUtils alipay=new AlipayUtils();
if(alipay.verifySign(request.getParameterMap())){
return"success";
}

return"fail";
}catch(Exceptione){
e.printStackTrace();
log.error("支付转化失败:{}",e);
return"fail";
}
}
}

来源:

推荐阅读:时尚女人网