这里较详细总结一下支付宝扫码支付,从三个方面总结
①参数配置
②跳转固定的支付宝页面进行扫码支付
③自定义二维码扫码支付
参数配置-开放平台相关配置(沙箱环境)
刚开始支付宝的配置参数还是有点让人懵逼的,跟微信支付有点不同,支付宝有个沙箱测试环境,跟正式环境差不多,不过正式环境还需要签约审核,没通过审核调用支付宝接口会报错访问受限。沙箱环境还是挺好用,开放平台登录 - 支付宝申请个账号就送AppID,首先需要点击设置密匙,这里可以下载阿里的工具或openSSL生成,如下用阿里的工具,点击生成密匙即可生成一对自己系统用的私钥公钥(了解RSA2非对称加密),我们要私钥配置到项目里,公钥配置给支付宝(下图“设置/查看”),阿里给我们发信息会用我们给它配的公钥进行加密,我们在用项目里配的私钥进行解密。当配置好应用公钥给支付宝后,支付宝会生成一个支付宝公钥给我们,这个也要配置到项目里,我们向支付宝发送信息时用它加密传送信息给支付宝,支付宝用它的支付宝私钥进行解密,这把钥匙我们看不到的,同样支付宝也看不到我们的应用私钥。除了如下标注的4个参数,还有其它几个固定参数见项目配置文件。
RSA 是一种非对称的签名算法,即签名密钥(私钥)与验签密钥(公钥)是不一样的, 私钥用于签名,公钥用于验签。在支付宝交易中,会出现两对公私钥,即商户公私钥、支付宝公私钥.
商户公私钥:由商户生成,商户私钥用于对商户发往支付宝的数据签名;商户公钥需要上传至支付宝,当支付宝收到商户发来的数据时用该公钥验证签名.
支付宝公私钥:支付宝提供给商户,当商户收到支付宝发来的数据时,用该公钥验签.
项目配置
注意:微信与支付宝的异步通知接口notifyUrl需要外网能访问,可以考虑ngrok/netapp/花生壳做内网穿透进行测试,如下使用了ngrok (官网 ngrok - secure introspectable tunnels to localhost 申请账号购买免费那个就可以玩了,解压进行安装目录,cmd 运行 sunny clientid 531244690e2319b6)。支付宝的同步通知只是非自定义二维码支付成功后的重定向的一个URL,不需要外网访问也是可以的,且自定义二维码扫码这个参数根本没用的。
#支付宝同步异步通知/微信异步通知,注意:自定义生成支付宝二维码支付方案时,配置的returnUrl的是没用的
alipay:
apiGateway: https://openapi.alipaydev.com/gateway.do
appId: 2016101000655165
privateKey: MIIEvAIBAD...省略...kz/wEn+w==
zfbPublicKey: MIIBIjANBgkqhk...省略...wIDAQAB
returnUrl: http://vehicle.free.idcfengye.com/vehicle/payment/service-order/alipay/return
notifyUrl: http://vehicle.free.idcfengye.com/vehicle/payment/service-order/alipay/notify
wxpay:
notifyUrl: http://vehicle.free.idcfengye.com/vehicle/payment/service-order/wxpay/notify
@Configuration
public class AlipayClientConfiguration {
// 网关
@Value("${alipay.apiGateway}")
public String apiGateway ;
//应用ID
@Value("${alipay.appId}")
public String appId ;
// 商户的私钥
@Value("${alipay.privateKey}")
public String privateKey ;
// 支付宝的公钥
@Value("${alipay.privateKey}")
public String zfbPublicKey ;
//几个固定参数
public static String format="json";
public static String charset="utf-8";
public static String signType="RSA2";
public static String aliPublicKey="";
@Bean
DefaultAlipayClient getAlipayClient() {
return new DefaultAlipayClient(
apiGateway,
appId,
privateKey,
format,
charset,
zfbPublicKey,
signType);
}