记录一下第一次做支付宝开发!
环境:
PC端的支付已经有人做完了,我是参考PC支付做App支付的!
1,支付宝开放平台登录,进入"开发者中心",找到沙箱环境!为了方便将沙箱url贴下!
支付宝沙箱链接
2,下载"支付宝开发平台开发助手"用来生成公钥私钥!
点击生成对应的密钥
应用私钥: 用户签名的密钥
支付宝公钥:复制生成的应用公钥在沙箱应用中粘贴到应用公钥中,然后生成支付宝公钥,保存支付宝公钥!
也就是说 ,下图1(支付宝开发助手exe中)生成之后粘贴到图2(网页沙箱环境中)中,然后会生成图3((网页沙箱环境中生成需要保存的公钥)
总结来说,通过exe支付宝应用助手,配置沙箱环境,获得其APPID、网关、应用私钥,支付宝公钥,以及应用公钥;
之后最好配置一个单独的类来记录保存这个数据,我这里是都存在了数据库中,启动获取;
3,配置好之后就可以进行支付宝开发了!是不是很快呀!
这里主要是为了初始化链接支付宝的客户端,注意你的APPID,公钥私钥等数据的正确性;
AlipayClient alipayClient =new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
AlipayConfig.rsa_private_key, AlipayConfig.FORMAT,AlipayConfig.charset,
AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradeAppPayRequest alipayTradeAppPayRequest = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
添加支付宝支付成功之后回调你后台的方法,LZ这里当时还出现个小问题,就是支付成功之后支付宝无法回调定义的方法,记录为"支付宝付款成功后无法回调"下文做解释处理!
alipayTradeAppPayRequest.setNotifyUrl(AlipayConfig.notify_url_app); //异步回调地址(后台)
这里是处理传递给支付宝的参数,订单号以及商品的一些信息,其中使用的order就是本项目中我的商品的信息,for循环是因为一个订单可以有多种商品;
String out_trade_no = new String(order.getOrderNo().getBytes("ISO-8859-1"),"UTF-8");
//付款金额,必填
String total_amount = new String(order.getDiscountOrderPrice().toString().getBytes("ISO-8859-1"),"UTF-8");
//订单名称,必填 --此处设为订单id
String subject = new String(order.getId().getBytes("ISO-8859-1"),"UTF-8");
//销售产品码(固定值),必填
String productCode = new String("FAST_INSTANT_TRADE_PAY".getBytes("ISO-8859-1"),"UTF-8");
String body = order.getOrderNo() ;
List<OrderDetail> orderDetailList= orderDetailService.queryByOrderNo(order.getOrderNo());
for (OrderDetail orderDetail : orderDetailList) {
body += ":" + orderDetail.getSku()
+ "-" + orderDetail.getGoodsName()
+ "-" + orderDetail.getNums()
+ "-" + orderDetail.getDiscountPrice() + ";";
}
body = new String(body.getBytes("ISO-8859-1"),"UTF-8");
model.setOutTradeNo(out_trade_no); //商户订单号,必填
model.setProductCode(productCode); //销售产品码(固定值),必填
model.setTotalAmount(total_amount); //支付金额,必填
model.setSubject(subject); //商户订单名称,必填
model.setBody(body); //商品描述,可空,对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
alipayTradeAppPayRequest.setBizModel(model);
上边的所有操作都是为了拼参数拼数据,现在拼好了,就可以发出请求了!
AlipayTradeAppPayResponse alipayTradePagePayResponse = alipayClient.sdkExecute(alipayTradeAppPayRequest);
这样就已经把请求发给支付宝了,他会返回给你一个字符串,app通过这个串的信息,调用支付宝进行支付!
if(alipayTradePagePayResponse.isSuccess()){
String resultString = alipayTradePagePayResponse.getBody(); //就是orderString 可以直接给APP请求,无需再做处理。
return resultString
}
这样子,前台就可以调用支付宝进行支付了,这时候你肯定会想成功了,我怎么改变订单支付状态呀!还记得之前配置的noticeUrl就是支付宝回调你的方法,现在知道了吧!
你可以在这个回调方法中进行判断是否订单成功支付,或者说余额是不是不够支付失败,都可以获取到,然后进行对应的修改订单状态操作!
4,支付宝回调方法:
1,从request中获取参数;
//1.从支付宝回调的request域中取值,并将请求中的参数转换为Map
Map<String, String> paramsMap = AliXMLUtil.convertRequestParamsToMap(request);
2,进行验签;
boolean isSignVerified = alipayService.isSignVerified(paramsMap);
if (isSignVerified) {
//验签成功,进行业务处理
//从paramsMap中获取支付宝传递过来的参数,如"app_id","gmt_create(交易创建时间)","out_trade_no(传递给支付宝订单号)"等参数
//然后根据trade_status判断交易状态,根据交易状态来进行你对应的操作(WAIT_BUYER_PAY >> 交易创建并等待买家付款 || TRADE_SUCCESS >> 交易成功)
}
public boolean isSignVerified(Map<String, String> conversionParams) throws Exception{
//logger.info("==================支付宝异步请求验签");
//签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
boolean signVerified = false;
try {
//调用SDK验证签名
signVerified = AlipaySignature.rsaCheckV1(conversionParams, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
} catch (AlipayApiException e) {
//logger.info("==================验签失败 !");
e.printStackTrace();
}
return signVerified;
}
结束语:
这样子,支付宝的简单交易就结束了,不得不佩服支付宝交易竟然给开发节省了太多的东西,只需要管理自己的业务处理就好,剩下的包括回调通知,都想到了,很周全!
而我感觉App调用支付宝支付对比于PC网页调用支付宝支付,最大的区别就是:
App使用 AlipayTradeAppPayRequest创建request请求,执行请求使用sdkExecute()来发出请求!
而PC使用AlipayTradePagePayRequest,执行使用pageExecute()来发出请求!
app关键在于你返回的字符串,用来唤醒支付宝支付!
网页其实也是,但是网页可以进行跳转链接,网页登录,当然不要害怕,这些支付宝也已经做好了!你所需要做的,和app开发差不了多少!
请求发出之后,支付宝返回给你所有的状态,并且调用你定义的响应通知url,相当于我把参数和响应方法给你,你处理完之后调用我给你得响应方法,而且你得携带着交易的很多信息参数供我查看详情!
简单的一来一回,确实很强!
还有就是,如果你app想直接调用支付宝app支付,那么你就直接返回那个字符串就好了,如果想自动执行接下来的操作,还可以继续进行业务逻辑操作!
参考链接:
https://opendocs.alipay.com/open/204/105465
https://www.jianshu.com/p/c92b82c94289
问题:
支付宝付款成功后无法回调:
修改方法请求都为POST,然后确定你的noticeUrl没有空格特殊字符
仅仅是作为初学者的个人记录,感谢你又花了五分钟听我瞎白活了一顿!如果对你有帮助,那更是太棒了!
我是一个致力于成为菜鸡水军的一个假的开发程序员,如果你喜欢,记得一起交朋友哦!
嗷呜~~~~~~~~~~~~~~~
等等,等等等等,等等等等等等等等等~~~~~~~~~~~~
再见!大锅锅,大解解,小迪迪,小妹没!