前言
我就是个沙雕,用错类,搞了一天。但我就是想喷,垃圾沙箱,不人性化,解释都不清楚,搞的很累。手机版的app在今天也无法登录与注册。估计很久没更新了还什么。文档也可能只更新了部分。信息错乱
步骤
总的步骤就是生成密钥,获取支付宝的密钥,接着用一个类发送请求,返回得到的是一个String,String是一个Form表单,会自动提交跳转到支付宝支付页面。
1. 生成密钥
这儿已经有在线版的生成密钥了,不再需要下载应用
点击生成密钥,再下载一下密钥,这儿的公钥要放在下一个网站里生成一个支付宝的公钥
到时候在类中使用的是密钥和支付宝的公钥
2. 点击进入研发服务
记住这三个玩意儿,都是有用的
3. 点击RSA2...密钥
在下面放入之前的公钥,就会提供一个支付宝公钥
小插曲:(因为我以前是搞过一次的,但是忘记了,所以不知道初次注册的操作会不会有出入。这儿比较疑惑的就是上图的公钥证书,可能第一次弄必须得搞这个公钥证书吧,公钥证书又得去第一个网址中生成CSR文件,然后导入。如果不需要弄这个公钥证书那是最好的了,还麻烦。)
左侧导航栏看商家信息按理是都存在的,如果不存在可能就是要搞公钥证书
最后
最后就是要弄类了
maven导入
<!-- 支付 -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.13.32.ALL</version>
</dependency>
Impl
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import org.springframework.stereotype.Service;
@Service
public class OrderServiceImpl {
final static String APP_ID = "第二个网址的APPID";
final static String APP_PRIVATE_KEY = "第一个网址的私钥";
final static String ALIPAY_PUBLIC_KEY = "第二个网址的支付宝公钥";
public String pay() {
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"utf-8",
ALIPAY_PUBLIC_KEY,
"RSA2");
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo("20150320010112312323");
model.setProductCode("FAST_INSTANT_TRADE_PAY");
model.setSubject("Iphone6 16G");
model.setTotalAmount("0.01");
//以上四个为必选内容。ProductCode是写死的,订单号这些可以自己生成
//model.setTimeoutExpress("30m");
request.setBizModel(model);
request.setReturnUrl("https://xxx");//据说是支付成功后返回的页面
request.setNotifyUrl("https://xxx");//回调的页面,可以用来执行支付成功后的接口调用什么的
// 这两个据说都得是外网能访问的,不是localhost那种,而且不能传参
try {
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
System.out.println(response.getBody());//输出的就是Form表单
return response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
}
实现类写在这儿了,像以前古老版本的有GitHub的,用的JSP。我这的就是Controller调用Impl,然后Controller接口直接return这个String,页面就会根据这个String的Form表单
自动进行跳转(因为Form下面有写js)。如果无误的话,就能到支付界面了。
然后再使用之前的商家信息页面的账号密码,支付
结尾
以下只是我的吐槽,可以不用看了
我是个憨批,起初在密钥那困了许久,实在不懂他在讲什么,因为我跳转一直说签名有问题,但其实最大的问题是我用错类了!!!!
AlipayTradePagePayRequest、AlipayTradePagePayModel,这是网页版正确的两个类,
首先!我用的是App的!!!应该是AlipayTradeAppPayRequest、AlipayTradeAppPayModel
然后一直出错,charset一改成utf-8就直接,我一度以为和charset有关,网上根本找不到这答案
如果我charset是gbk,下图。并且setObject等一些参数必须用中文!!!不用中文就也是上面那张图一样!
然后!我看了各种博客以后,发现原来不是App,我就把App删了!还是错误错误错误
最后才注意到用的是Page的,被我自己蠢哭