在项目中总会遇到支付宝支付的问题吧!!!咱们web程序员总要调用一次支付宝吧!!哈哈哈哈,本文章使用vue + spring-boot来完成一个在沙箱的情况下完成的支付宝扫码支付,但是我会根据spring-boot的特性尽可能的保证高可用,实现改一改配置就拿走用。
Alipay
选择我标红的进入
从首页点击API,在下面找到我标记的沙箱
小程序文档 - 支付宝文档中心
跟随指引进入沙箱控制台
点击然后根据跳转的二维码,使用手机扫码进行下载安装就可以了
手机端的沙箱版本登录进入,以及账号寻找登入
阿丹:我在这里找了好一会就是登录不进来所以给大家避坑一下
1.下载好了正常安装
2.下载好了正常安装
在平台中进入沙箱账号找到自己的沙箱账号
坑出现了!!!我看到的登录页面是这样的!!
问题是没有给我账号的手机号码啊!小问题跟着阿丹!!
根据阿丹的指引!看到了吗!支付宝号,邮箱登录!!!
这里的买家账号就是使用的邮箱粘贴使用,密码是6个1,付款密码也是的!要记住!!然后就可以登录进来了!!!
就进来了,默认的余额是一百万!!给阿丹点赞点关注了我反手就是一个沙箱一百万!听懂掌声!
小程序文档 - 支付宝文档中心
https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB
下载完了就安装就行!! 完事就是这样!!!
我们开始配置我们需要的公钥和私钥
首先获取到我们的公钥和私钥,进入软件使用指引的方式来获取
进入我们的沙箱平台
登录 - 支付宝
点击设置并查看
我们就获得到了应用的公钥和支付宝的公钥
就可以啦!
因为我们使用的是maven项目
Maven Central: com.alipay.sdk:alipay-sdk-java
调用扫一扫支付需要的maven依赖。
com.alipay.sdk
alipay-sdk-java
4.38.76.ALL
com.alibaba
fastjson
1.2.83_noneautotype
org.bouncycastle
bcprov-jdk15on
1.62
dom4j
dom4j
1.6.1
com.squareup.okhttp3
okhttp
3.12.13
junit
junit
4.12
test
alipay-sdk-java: 我们调用支付宝支付功能的主要依赖
bcprov-jdk15on:提供加密算法
小程序文档 - 支付宝文档中心
下载完毕解压出来的文件如下:
我们来看看官网给我们的东西我们可以得到什么!!!
这个配置类告诉了我们在开发的过程中,我们需要用到什么属性,在这里也说明了,但是这里一些配置如果在程序中写死了,那么可重用性质就不高了。
所以这个配置我们在代码中使用spring-boot的约定大于配置的写法使用配置中注入方式这样写:
配置类:
package com.adn.common.utils;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Component
@Data
@ConfigurationProperties(prefix = "apputil")
public class AppUtil implements InitializingBean {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
private String appid;
// 商户私钥,您的PKCS8格式RSA2私钥
private String merchantprivatekey;
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。.
private String alipaypublickey;
// 服务器异步通知页面路径
//需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
private String notifyurl;
// 页面跳转同步通知页面路径
//需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
private String returnurl;
// 签名方式
private String signtype;
// 字符编码格式
private String charset;
// 支付宝网关,注意这些使用的是沙箱的支付宝网关,与正常网关的区别是多了dev
private String gatewayurl;
// 支付宝网关
private String logpath;
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(this.logpath + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public void afterPropertiesSet() throws Exception {
}
/**
* 验签,是否正确
*/
public boolean checkSign(HttpServletRequest request) {
Map requestMap = request.getParameterMap();
Map paramsMap = new HashMap<>();
requestMap.forEach((key, values) -> {
String strs = "";
for (String value : values) {
strs = strs + value;
}
System.out.println(key + "===>" + strs);
paramsMap.put(key, strs);
});
System.out.println();
//调用SDK验证签名
try {
return AlipaySignature.rsaCheckV1(paramsMap, this.getAlipaypublickey(), this.getCharset(), this.getSigntype());
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("*********************验签失败********************");
return false;
}
}
}
按照我的注释在配置文件yml中写上对应的配置
#支付宝使用配置
pay:
#应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
app_id:
#商户私钥,您的PKCS8格式RSA2私钥
merchant_private_key:
#支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥
alipay_public_key:
#服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
notify_url:
#页面跳转同步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
return_url:
#签名方式
sign_type:
#字符编码格式
charset: utf-8
#支付宝网关,注意这些使用的是沙箱的支付宝网关,与正常网关的区别是多了dev
gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
#支付宝网关 日志书写地址
log_path:
注意!!!!!!!
如果发现读取不到、以及报错数据那么就使用双引号括起来!!!
notify_url和return_url可以先不用写在下面开发完毕在写就可以!
这样写的好处是方便开发如果在微服务的架构下这样写配置就会更加灵活!!!!
package com.adn.common.utils;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanUtil {
//创建支付宝所需要的对象
@Autowired
AppUtil appUtil;
@Bean
public AlipayClient alipayClient(){
System.out.println(appUtil.toString());
return new DefaultAlipayClient(appUtil.getGatewayurl(),appUtil.getAppid(),appUtil.getMerchantprivatekey(),"json", appUtil.getCharset(),
appUtil.getAlipaypublickey(),appUtil.getSigntype());
}
@Bean //支付信息的配置
public AlipayTradePagePayRequest alipayTradePagePayRequest(){
return new AlipayTradePagePayRequest();
}
}
这个类其实没啥可说的,这里就不过多讲解,强调一下使用的是刚才的配置类就可以了。