config 证书模式支付配置类
package com.ggba8.ggba.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class InitAlipayConfig {
@Value("${alipay.shop.private_key}")
private String privateKey;
@Value("${alipay.shop.gateway_url}")
private String serverUrl;
@Value("${alipay.shop.appid}")
private String appId;
@Value("${alipay.shop.app_cert_path}")
private String appCertPath;
@Value("${alipay.shop.alipay_public_cert_path}")
private String alipayPublicCertPath;
@Value("${alipay.shop.root_cert_path}")
private String rootCertPath;
@Bean
public com.alipay.api.AlipayConfig getAlipayConfig() {
com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setServerUrl(serverUrl);
alipayConfig.setAppId(appId);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
alipayConfig.setFormat("json");
alipayConfig.setAppCertPath(appCertPath);
alipayConfig.setAlipayPublicCertPath(alipayPublicCertPath);
alipayConfig.setRootCertPath(rootCertPath);
return alipayConfig;
}
}
小程序支付业务(证书授权模式)
类型是JSPAI_PAY
@Override
public String alipay(LogPay log,String passbackParams,String code) throws Exception {
// 构造请求参数以调用接口
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
AlipayTradeCreateModel model = new AlipayTradeCreateModel();//支付宝订单格式
request.setReturnUrl(return_url);
request.setNotifyUrl(notify_url);
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();//验签
certAlipayRequest.setServerUrl(alipayConfig.getServerUrl());
certAlipayRequest.setAppId(alipayConfig.getAppId()); //APPID 即创建应用后生成,详情见创建应用并获取 APPID
certAlipayRequest.setPrivateKey(alipayConfig.getPrivateKey()); //开发者应用私钥,由开发者自己生成
certAlipayRequest.setFormat("json"); //参数返回格式,只支持 json 格式
certAlipayRequest.setCharset("UTF-8"); //请求和签名使用的字符编码格式,支持 GBK和 UTF-8
certAlipayRequest.setSignType("RSA2"); //商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。
certAlipayRequest.setCertPath(alipayConfig.getAppCertPath()); //应用公钥证书路径(app_cert_path 文件绝对路径)
certAlipayRequest.setAlipayPublicCertPath(alipayConfig.getAlipayPublicCertPath()); //支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径)
certAlipayRequest.setRootCertPath(alipayConfig.getRootCertPath()); //支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径)
AlipayClient client = new DefaultAlipayClient(certAlipayRequest);
com.alibaba.fastjson.JSONObject json = alipayClientUtils2.getAuthToken(code);
if(json != null){
String aliOpenID = json.getString("user_id");
model.setBuyerId(aliOpenID);
}
model.setOutTradeNo(log.getOrderId()); //订单号
if(debug){
model.setTotalAmount("0.01");
}else{
model.setTotalAmount(log.getMoneyInit().floatValue()+""); //金额
}
model.setSubject(log.getTitle()); //订单名
model.setBody(log.getTitle()); //订单描述
// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
model.setTimeoutExpress(timeout_express);
// params.put("product_code","FAST_INSTANT_TRADE_PAY");
model.setProductCode("JSAPI_PAY");
if(StringUtils.isNotBlank(passbackParams)){
model.setPassbackParams(passbackParams);
}
request.setBizModel(model);
AlipayTradeCreateResponse res = client.certificateExecute(request);
return res.getBody();
}
SDK客户端支付(证书模式)
调用生成sdk字符串 支付类型是passback_params
@Override
public String pay(LogPay log,String passbackParams) throws Exception {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();//验签
certAlipayRequest.setServerUrl(alipayConfig.getServerUrl());
certAlipayRequest.setAppId(alipayConfig.getAppId()); //APPID 即创建应用后生成,详情见创建应用并获取 APPID
certAlipayRequest.setPrivateKey(alipayConfig.getPrivateKey()); //开发者应用私钥,由开发者自己生成
certAlipayRequest.setFormat("json"); //参数返回格式,只支持 json 格式
certAlipayRequest.setCharset("UTF-8"); //请求和签名使用的字符编码格式,支持 GBK和 UTF-8
certAlipayRequest.setSignType("RSA2"); //商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。
certAlipayRequest.setCertPath(alipayConfig.getAppCertPath()); //应用公钥证书路径(app_cert_path 文件绝对路径)
certAlipayRequest.setAlipayPublicCertPath(alipayConfig.getAlipayPublicCertPath()); //支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径)
certAlipayRequest.setRootCertPath(alipayConfig.getRootCertPath()); //支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径)
AlipayClient client = new DefaultAlipayClient(certAlipayRequest);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setReturnUrl(return_url);
request.setNotifyUrl(notify_url);
JSONObject params = new JSONObject();
params.put("method","alipay.trade.app.pay");
params.put("out_trade_no",log.getOrderId()); //订单号
if(debug){
params.put("total_amount","0.01");
}else{
params.put("total_amount",log.getMoneyInit().floatValue()+""); //金额
}
params.put("subject",log.getTitle()); //订单名
params.put("body",log.getTitle()); //订单描述
// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
params.put("timeout_express",timeout_express);
params.put("product_code","FAST_INSTANT_TRADE_PAY");
if(StringUtils.isNotBlank(passbackParams)){
params.put("passback_params",passbackParams);
}
request.setBizContent(params.toString());
AlipayTradeAppPayResponse res = client.sdkExecute(request);
return res.getBody();
}
支付宝证书登录 (证书模式)
package com.ggba8.ggba.utils;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.*;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.AlipayConfig;
import com.ggba8.ggba.entity.Userinfo;
import com.ggba8.ggba.manager.UserinfoMng;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Component
public class AlipayClientUtils2 {
@Resource(name = "getAlipayConfig")
private AlipayConfig alipayConfig;
public JSONObject getAuthToken(String code) throws AlipayApiException {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(alipayConfig.getServerUrl());
certAlipayRequest.setAppId(alipayConfig.getAppId()); //APPID 即创建应用后生成,详情见创建应用并获取 APPID
certAlipayRequest.setPrivateKey(alipayConfig.getPrivateKey()); //开发者应用私钥,由开发者自己生成
certAlipayRequest.setFormat("json"); //参数返回格式,只支持 json 格式
certAlipayRequest.setCharset("UTF-8"); //请求和签名使用的字符编码格式,支持 GBK和 UTF-8
certAlipayRequest.setSignType("RSA2"); //商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。
certAlipayRequest.setCertPath(alipayConfig.getAppCertPath()); //应用公钥证书路径(app_cert_path 文件绝对路径)
certAlipayRequest.setAlipayPublicCertPath(alipayConfig.getAlipayPublicCertPath()); //支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径)
certAlipayRequest.setRootCertPath(alipayConfig.getRootCertPath()); //支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径)
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode(code);
request.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse response = alipayClient.certificateExecute(request);
if (response.isSuccess()) {
String body = response.getBody();
if (!StringUtils.isEmpty(body)) {
JSONObject jsonObject = JSONObject.parseObject(body);
JSONObject object = jsonObject.getJSONObject(AlipayClientUtils.AliPayLoginContant.ALIPAY_SYSTEM_OAUTH_TOKEN_RESPONSE);
return object;
}
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return null;
}
}
controller
/**
* 支付宝小程序第三方登陆
* @param code
* @param request
* @param response
*/
@RequestMapping("/qyStaffAlipay/login")
public Result qyStaffAlipay(@RequestParam(value = "auth_code") String code,
HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
JSONObject json = AlipayClientUtils.getAuthToken(code);
if(json != null){
String aliOpenID = json.getString("user_id");
if(org.apache.commons.lang3.StringUtils.isNotBlank(aliOpenID)){
//登陆业务
return this.AliLogin(aliOpenID ,false,request,true);
}else {
logger.error("登录失败:unionId为空");
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("登录失败:" + e.getMessage());
}
return null;
}
公钥私钥模式 config
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
@Value("${alipay.shop.appid}")
public String app_id;
@Value("${alipay.scan.appid}")
public String scan_app_id;
// 商户私钥,您的PKCS8格式RSA2私钥
@Value("${alipay.shop.private_key}")
public String merchant_private_key;
@Value("${alipay.scan.private_key}")
public String scan_private_key;
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
@Value("${alipay.shop.public_key}")
public String alipay_public_key;
@Value("${alipay.scan.public_key}")
public String scan_public_key;
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
@Value("${alipay.shop.notify_url}")
public String notify_url;
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
@Value("${alipay.shop.return_url}")
public String return_url;
// 签名方式
@Value("${alipay.shop.sign_type}")
public String sign_type;
// 字符编码格式
@Value("${alipay.shop.charset}")
public String charset;
// 支付宝网关
@Value("${alipay.shop.gateway_url}")
public String gatewayUrl;
@Value("${alipay.shop.service}")
public String service;
@Value("${alipay.shop.timeout_express}")
private String timeout_express;
@Autowired
private LogPayMng logPayMng;
@Value("${ggba.debug}")
private boolean debug;
授权码登录(公私钥模式)
可以试着像证书模式一样先把公钥私钥以
@Configuration交给spring容器然后引入
package com.ggba8.ggba.utils;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import org.apache.commons.lang3.StringUtils;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import static com.alipay.api.AlipayConstants.CHARSET_UTF8;
/**
* @author wwz
*/
public class AlipayClientUtils {
/**
* @author wwz
*/
public class AliPayLoginContant {
public final static String BASE_URL = "http://wwz1994.e2.luyouxia.net:22851";
/**
* 网关地址
*/
public final static String SERVICE_URL = "https://openapi.alipay.com/gateway.do";
/**
* appid
*/
public final static String APPID = "xxxx";
/**
* 回调地址
*/
public final static String REDIRECT_URL = "XXXXX";
/**
* 支付宝公钥(在签名)
*/
public final static String ALIPAY_PUBLIC_KEY = "xxxx";
/**
* 你自己生成的私钥
*/
public final static String APP_PRIVATE_KEY = "xxxx";
public static final String ALIPAY_SYSTEM_OAUTH_TOKEN_RESPONSE = "alipay_system_oauth_token_response";
}
/**
* 创建单例
* @return
*/
private static class AlipayClientHolder{
private static final AlipayClient alipayClient = new DefaultAlipayClient(AliPayLoginContant.SERVICE_URL, AliPayLoginContant.APPID, AliPayLoginContant.APP_PRIVATE_KEY, "json", CHARSET_UTF8, AliPayLoginContant.ALIPAY_PUBLIC_KEY, "RSA2");
}
/**
* 获取token信息
* @param code
* @return
* @throws AlipayApiException
*/
public static JSONObject getAuthToken(String code) throws AlipayApiException {
AlipayClient alipayClient = AlipayClientHolder.alipayClient;
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode(code);
request.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
if(response.isSuccess()){
String body = response.getBody();
if(!StringUtils.isEmpty(body)){
JSONObject jsonObject = JSONObject.parseObject(body);
JSONObject object = jsonObject.getJSONObject(AliPayLoginContant.ALIPAY_SYSTEM_OAUTH_TOKEN_RESPONSE);
return object;
}
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return null;
}
}
小程序支付业务(公私钥模式支付)
service
String alipay(LogPay log, String passbackParams,String code) throws Exception;
serviceimpl
@Override
public String alipay(LogPay log,String passbackParams,String code) throws Exception {
// 构造请求参数以调用接口
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
AlipayTradeCreateModel model = new AlipayTradeCreateModel();
request.setReturnUrl(return_url);
request.setNotifyUrl(notify_url);
AlipayClient client = new DefaultAlipayClient(gatewayUrl,app_id,merchant_private_key,"json",charset,alipay_public_key,sign_type);
com.alibaba.fastjson.JSONObject json = AlipayClientUtils.getAuthToken(code);
if(json != null){
String aliOpenID = json.getString("user_id");
model.setBuyerId(aliOpenID);
}
model.setOutTradeNo(log.getOrderId()); //订单号
if(debug){
model.setTotalAmount("0.01");
}else{
model.setTotalAmount(log.getMoneyInit().floatValue()+""); //金额
}
model.setSubject(log.getTitle()); //订单名
model.setBody(log.getTitle()); //订单描述
// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
model.setTimeoutExpress(timeout_express);
// params.put("product_code","FAST_INSTANT_TRADE_PAY");
model.setProductCode("JSAPI_PAY");
if(StringUtils.isNotBlank(passbackParams)){
model.setPassbackParams(passbackParams);
}
request.setBizModel(model);
AlipayTradeCreateResponse res = client.certificateExecute(request);
return res.getBody();
}
SDK客户端支付(公私钥模式)
调用生成sdk字符串 FAST_INSTANT_TRADE_PAY支付
service
String pay(LogPay log, String passbackParams) throws Exception;
serviceimpl
@Override
public String pay(LogPay log,String passbackParams) throws Exception {
AlipayClient client = new DefaultAlipayClient(gatewayUrl,app_id,merchant_private_key,"json",charset,alipay_public_key,sign_type);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setReturnUrl(return_url);
request.setNotifyUrl(notify_url);
JSONObject params = new JSONObject();
params.put("method","alipay.trade.app.pay");
params.put("out_trade_no",log.getOrderId()); //订单号
if(debug){
params.put("total_amount","0.01");
}else{
params.put("total_amount",log.getMoneyInit().floatValue()+""); //金额
}
params.put("subject",log.getTitle()); //订单名
params.put("body",log.getTitle()); //订单描述
// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
params.put("timeout_express",timeout_express);
params.put("product_code","FAST_INSTANT_TRADE_PAY");
if(StringUtils.isNotBlank(passbackParams)){
params.put("passback_params",passbackParams);
}
request.setBizContent(params.toString());
AlipayTradeAppPayResponse res = client.sdkExecute(request);
return res.getBody();
}