原创不易,有帮助的点赞和收藏
先按照步骤一步步来。
1.先申请一个账号
·注册蚂蚁金服开发者账号(免费)
注册地址:https://open.alipay.com,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(选自研)。
2.注册完之后进入沙箱环境配置秘钥
2.1
https://openhome.alipay.com/platform/appDaily.htm 此处直达沙箱。
2.2
https://opendocs.alipay.com/open/291/105971
到达此地址生成秘钥
2.3
直接生成秘钥(公钥+私)就可以了。
接下来正片:
3.代码部分
3.1 application.yml
alipay:
#appid
appid: 2016102700769693;
#商户私钥,PKCS8格式RSA2私钥
merchant_private_key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCEnTNTQxR+KBKV7EX2tbzdh50MF7gQrA
6R3FfMejli/Y61F5WpbA9yVisV6Jnc4guqUxHGv+Y3FKixV4VBXC2Vx/XRNG7UikU62IH3/2Rd4n/LY8o5haIHGlDCxq4ERJGbNuN1XeAmIrnToLe5TAQKBgQDib+X114l6op6iThtdC1mkiLmreVrjStLf3PV9VLJIDDDIiTXK2/P8mB26ofHjSyMFKyhUm3hBrQ2mrlw71Q12JrojrD9zy3W+l4n8/QF1LzKy/j8RqPA7C6mHa/B+MndAtNndnOLawWDduDgNgZDP9iUklI1s2H5dvXzbjHMsWQKBgQCV7X+gRz5slj47OisNH1lRNhBu+71LjfzegrxtW4+6beyA5ET3QCIw0RBb5g5fSAEfpEkX7fAiiUA1Uming66JjpYHXPBzP0HtmP8JbHqCurOdCCOp9KxrFMxhPmTz2C/vuUAOVNpkK9buPyr251/vus0dvEsfkjWV5AC8YrJlCwKBgBQp+sRlqSxuhsnVQsKKXDU2p7IJYHqVEyo0NvguLqIT09RHw66I37VCpoMUIMIo0rmHGlROc+sFSg3pwPTjCAvZbwH2OMBLAfUy8WrB7PtOdKlT0rHz5VCcvT/98LCMNephMHV3nwvz5HhaC0PIoeii9rPHNsDWlooqcY/rdeYhAoGAdGdwNr35zo8cBBoWgNq9GxuRyMl1YCr+kLgKmhGD1ygvfqc8kIdfxG0deWx17i5WiP2hro2Taw0LKBsynBTWN4DYJSFYovITOukV4ngx6jwQ5jQClJseHwmH4VxzPwuztDktbbMd2LZc6p9quUZNKzDqvlKKNRnsttLOa3Vpsp8CgYEA2YbrZ390IFkG2yieQ4DjLT1sNpSArLb84+c2TsOjby7QZtIGUOGTV0rhhoKQW73X3BUw5KCTcDOa/NeI3NxHtl5hK8f5CPgxMAM29uRabQleb1Fb1Rf4Q0TFD4627yfBAABBiWVCV2EImcYGCpLbORuLoO9//5dYc2lYtOvnEbM=;
#支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
alipay_public_key: MIIBIjANBgkqhkxyWQx7+bPk53oE5KOZOwOn+MWcMBYxukvlt+pceQjkaN26L0HUD8OtDF39wgnILDj3LgSpcPRPtblR/Og8vNiMYGFwIDAQAB;
# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
notify_url: http://xxxx:端口/error.html
# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
return_url: http://xxx:端口/sccess.html
# 签名方式
sign_type: RSA2
# 字符编码格式
charset: utf-8
# 支付宝网关
gatewayUrl: https://openapi.alipaydev.com/gateway.do
3.2 config文件如下
@Configuration
@ConfigurationProperties(prefix = "alipay")
@Data
public class AliPayConfig {
//
private String appid;
//私钥
private String merchantPrivateKey;
//公钥
private String alipayPublicKey;
private String notifyUrl;
private String returnUrl;
private String signType;
private String charset;
private String gatewayUrl;
//此处是dev、prod环境使用的证书方式
public AlipayClient getAlipayCertClient() throws AlipayApiException {
//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用Id
certAlipayRequest.setAppId(appid);
//设置应用私钥
certAlipayRequest.setPrivateKey(merchantPrivateKey);
//设置请求格式,固定值json
certAlipayRequest.setFormat("json");
//设置字符集
certAlipayRequest.setCharset(CharsetUtil.UTF_8);
//设置签名类型
certAlipayRequest.setSignType(AlipayConstants.SIGN_TYPE_RSA2);
//设置应用公钥证书路径
certAlipayRequest.setCertPath("");
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath("");
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath("");
//构造client
return new DefaultAlipayClient(certAlipayRequest);
}
//测试方法
public AlipayClient getAlipayClient() throws AlipayApiException{
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,//支付宝网关
appid,//appid
merchantPrivateKey,//商户私钥
"json",
charset,//字符编码格式
alipayPublicKey,//支付宝公钥
signType//签名方式
);
//返回付款信息
return alipayClient;
}
}
3.3 controller文件
@Autowired
private PayService payService;
/**
* 支付接口
*/
@PostMapping("/pay")
@ApiOperation(value = "调起进行支付", notes = "调起进行支付")
@SneakyThrows
public ResponseEntity<?> pay(HttpServletResponse httpResponse, @Valid @RequestBody PayParam payParam) {
PayInfoDto payInfoDto = payService.payInfoInit(payParam);
return payService.doPay(httpResponse,payInfoDto);
}
payService文件
public interface PayService {
/**
* 功能描述: 支付前封装
* 〈〉
* @Param: [payParam]
* @Return: com.jarjar.mallcloud.demo.bean.dto.pay.PayInfoDto
* @Author: tonyJarjar
* @Date: 2020/10/29 13:31
*/
PayInfoDto payInfoInit(PayParam payParam);
/**
* 进行支付
* @param httpResponse
* @param payInfo
* @return
* @throws IOException
*/
ResponseEntity<?> doPay(HttpServletResponse httpResponse, PayInfoDto payInfo) throws IOException, AlipayApiException;
}
PayServiceImpl文件
@Service
public class PayServiceImpl implements PayService {
@Autowired
private Snowflake snowflake;
@Autowired
private AliPayConfig aliPayConfig;
@Override
public PayInfoDto payInfoInit(PayParam payParam) {
PayInfoDto payInfoDto = new PayInfoDto();
if (payParam.getOrderType()==1)
payInfoDto.setPayAmount(900d);
payInfoDto.setBody("免广告购买");
payInfoDto.setPayNo(String.valueOf(snowflake.nextId()));
payInfoDto.setBizUserId("1111");
payInfoDto.setPayType(payParam.getPayType());
payInfoDto.setApiNoticeUrl("/notice/pay/order/" + payParam.getPayType());
payInfoDto.setReturnUrl(payParam.getReturnUrl());
return payInfoDto;
}
@Override
public ResponseEntity<?> doPay(HttpServletResponse httpResponse, PayInfoDto payInfo) throws IOException, AlipayApiException {
AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();
alipayRequest.setNotifyUrl(aliPayConfig.getNotifyUrl());
AlipayTradeAppPayModel alipayTradeAppPayModel = new AlipayTradeAppPayModel();
alipayTradeAppPayModel.setOutTradeNo(payInfo.getPayNo());
alipayTradeAppPayModel.setSubject(payInfo.getBody());
alipayTradeAppPayModel.setTotalAmount(Double.toString(payInfo.getPayAmount()));
alipayTradeAppPayModel.setProductCode("QUICK_MSECURITY_PAY");
alipayRequest.setBizModel(alipayTradeAppPayModel);
//String body = aliPayConfig.getAlipayCertClient().sdkExecute(alipayRequest).getBody();
String body = aliPayConfig.getAlipayClient().pageExecute(alipayRequest).getBody();
return ResponseEntity.ok(body);
}
最终结果展示
ps:沙箱环境和正式环境一样的。所以真正要测试自己的key的时候只需要替换参数即可。
一般都使用证书方式去调起支付,可以参考config的另外一个client
通尼渣渣
文章皆为原创,转载请注明作者
觉得有帮助的不妨点赞收藏、也可以将疑惑的地方私信或者评论我。