其实支付宝SDK弄得已经很清楚了,不像某些sdk连JAVA版本的都没有。注意注意:支付宝授权之后才能获取用户信息,但是想要授权就只能去掉用支付宝的接口,跳转到支付宝用户点击确定之后才能授权成功,但可惜的是,此时是无法跳转到自己的app产品中的,只能跳转到支付宝的某个界面中,如果想要跳回到自己的页面,只能使用支付宝登录那个接口。客服给我的建议是让用户自己去填写他们自己的支付宝账号,后来想出来一种办法,但是没去实验是否可以实现。
/********************可以配置成全局变量,以后就省的再去写一遍了********************************************/
这几个参数配置好了之后
/**
* 支付接口
* @param body 订单具体描述信息,可不传
* @param subject 商品的标题
* @param outTradeNo 唯一订单号
* @param timeoutExpress 该笔订单允许的最晚付款时间,取值范围:1m~15d(m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)
* @param totalAmount 订单总金额(单位元)
* @param notifyUrl 支付宝服务器主动通知商户服务器里指定的页面http/https路径
* @throws UnsupportedEncodingException
*/
@RequestMapping("pay")
@ResponseBody
public String pay(/*String body,*/String subject,String outTradeNo,String timeoutExpress,String totalAmount,String notifyUrl,
@RequestParam(value = "userid", required = false) String userid,
@RequestParam(value = "commodityid", required = false) String commodityid,HttpServletResponse response2) throws UnsupportedEncodingException {
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
try {
outTradeNo = usertoredbagService.selectnownow()+userid;
totalAmount = alipayService.selectordermoney(commodityid);
subject = alipayService.selectsbuject(commodityid);
timeoutExpress = "15m";
notifyUrl="这个里面填写的是回调地址(一定要能访问到的回调地址)";
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// model.setBody(body);
model.setSubject(subject);
model.setOutTradeNo(outTradeNo);
model.setTimeoutExpress(timeoutExpress);
model.setTotalAmount(totalAmount);
model.setProductCode("QUICK_MSECURITY_PAY");
String a = userid + "," + commodityid;
model.setPassbackParams(URLEncoder.encode(a,"UTF-8"));
request.setBizModel(model);
request.setNotifyUrl(notifyUrl);
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
return response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return notifyUrl;
}
然后我们需要支付宝支付的二次验证,此时需要注意几点,Android是我封装的一个类,其中无非就是返回给安卓的一些属性,可以换成自己需要的,我代码中的userid是从支付带过去的,具体写法,参考加粗红色字体
/**
* 支付回调接口
* @param paramsMap 将异步通知中收到的待验证所有参数都存放到map中
* @throws AlipayApiException
* @throws UnsupportedEncodingException
*/
@RequestMapping("payNotify")
@ResponseBody
public String payNotify(/*Map
Map
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(params,ALIPAY_PUBLIC_KEY,CHARSET,"RSA2"); //调用SDK验证签名
System.out.println(signVerified);
if(signVerified){
// TODO 验签成功后
//按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure
//注意这句话 ↑ ↑ ↑ 这句话说的是,要返回fail 或者是success这样才能知道是否已经结束,不然会一次次请求的
String tradeStatus = params.get("trade_status");
// 交易创建
if (StringUtils.equals(tradeStatus, "WAIT_BUYER_PAY")) {
}
// 交易成功
if (StringUtils.equals(tradeStatus, "TRADE_SUCCESS")) {
String passback_params = params.get("passback_params");
passback_params = URLDecoder.decode(passback_params);
String[] ar = passback_params.split(",");
String userid = ar[0];
String commodityid = ar[1];
System.out.println(commodityid);
System.err.println(userid);
if(commodityid.equals("100000001")){
/************加入自己的业务逻辑,此时的订单id(commodityid)可以改成自己的此处只是个例子,首先需要在支付宝中设定,如果有逻辑的体现,还需要再数据库中自己添加***************/
}
return "success";
}
// 未付款交易超时关闭,或支付完成后全额退款
if (StringUtils.equals(tradeStatus, "TRADE_CLOSED")) {
ad.setCode(0);
ad.setMessage("交易超时");
return "fail";
}
// 交易结束,不可退款
if (StringUtils.equals(tradeStatus, "TRADE_FINISHED")) {
ad.setCode(1);
ad.setMessage("交易结束");
return "fail";
}
}else{
// TODO 验签失败则记录异常日志,并在response中返回failure.
System.out.println("验签失败");
//System.out.println("成功"+requestParams.get(req).toString());
ad.setCode(0);
ad.setMessage("验签失败");
return "failure";
}
return "完成";
}
至此,支付宝的app端支付就可以使用了
下面我们来记录一下提现接口 里面的Withdraw也是封装的一个类,为了json嘛,写了一个,也就是返回给前端的各种数据,可以自行更改
@RequestMapping("withdraw")
@ResponseBody
public Withdraw withdraw(@RequestParam(value = "userid", required = false) String userid,String orderNo,String payeeAccount,String amount,String payerShowName,String payeeRealName,String remark,
@RequestParam(value = "alipayid", required = false) String alipayid,Withdraw ww) throws AlipayApiException {
/* //提现次数
Integer wnum=alipayService.selectnum(userid);
if(wnum==1){
ww.setCode(0);
ww.setMessage("您今天已经提现过了");
ww.setMoney("0");
ww.setOrderNo("0");
}else if (wnum==0){ */ //此处限制了提现次数
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest();
List
if(list.get(0).getAlipayid()==null){
ww.setCode(0);
ww.setMessage("请先绑定支付宝账号");
ww.setMoney("0");
ww.setOrderNo("0");
}else if(list.get(0).getAlipayid()!=null){
alipayid=userService.selectalipayid(userid);
orderNo = usertoredbagService.selectnownow()+userid;
payeeAccount = alipayService.selectalipayid(userid);
payerShowName="支付宝显示的付款方姓名";
// payeeRealName=alipayService.selectalipayid(userid);
System.out.println(orderNo);
request.setBizContent("{" +
" \"out_biz_no\":\""+orderNo+"\"," + // 订单号唯一
" \"payee_type\":\"ALIPAY_LOGONID\"," +
" \"payee_account\":\""+payeeAccount+"\"," +
" \"amount\":\""+amount+"\"," +
" \"payee_account\":\""+alipayid+"\","+
" \"payer_show_name\":\""+payerShowName+"\"," + // 付款方姓名
/* " \"payee_real_name\":\""+payeeRealName+"\"," + // 收款方姓名
" \"remark\":\""+remark+"\"," +*/
" }");
/* Integer gold = alipayService.selectusergold(userid);//此步骤查询出来用户现有的宝石数量
Integer num = (int) (Double.parseDouble(amount)*10);//此处查询出来用户提现的时候需要多少宝石
if(gold
ww.setMessage("您的宝石数量不足");
ww.setMoney("0");
ww.setOrderNo("0");
}
else if(gold>=num){ */ //此处是自己的业务逻辑,可以改成自己的
AlipayFundTransToaccountTransferResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
alipayService.insertwithdraw(orderNo,userid,amount);
alipayService.updateusermoney(userid,amount);
ww.setCode(1);
ww.setMessage("提现成功");
ww.setMoney(amount);
ww.setOrderNo(orderNo);
alipayService.updategold(userid,amount);
return ww;
} else {
System.out.println("调用失败");
ww.setCode(0);
ww.setMessage("提现失败");
ww.setMoney("0");
ww.setOrderNo("");
return ww;
}
}
/*}*/
/*}*/
return ww;
}
至此,支付宝app端的提现也做完了
欢迎大家指导出不对的地方,直接私信我就好