支付宝当面付-扫码支付

1、需要jar包

2、请求支付

 private static AlipayTradeService  tradeService;
    @Autowired
    static {
        /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数
         *  Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录
         */
        Configs.init("pay.properties");

        /** 使用Configs提供的默认参数
         *  AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new
         */
        tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
    }


/**
	 * 支付宝充值【当面付-扫码支付】
	 */
	@Login
	@PostMapping("alipayReCharge")
	public R alipayReCharge(@RequestBody Map params,HttpServletRequest request,@RequestAttribute(AuthorizationInterceptor.USER_KEY) Long userId){
		String amount = String.valueOf(params.get("amount"));
		String captchaCode = (String) params.get("captcha");
		String uuid = (String) params.get("uuid");
		boolean captcha = captchaService.validate(CaptchaEntity.RECHARGE_CAPTCHA_PREFIX+uuid, captchaCode);
		if(!captcha){
			return R.error("验证码不正确");
		}
		// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
        // 需保证商户系统端不能重复,建议通过数据库sequence生成,
        String outTradeNo = userId+"_" + System.currentTimeMillis() + (long) (Math.random() * 10000000L);
        // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
        String subject = "xxxx扫码充值";
        // (必填) 订单总金额,单位为元,不能超过1亿元
        // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
        String totalAmount = amount;
        // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
        String body = "充值金额"+amount+"元";
        // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
        String storeId = "test_store_id";

        // 支付超时,定义为120分钟
        String timeoutExpress = "1m";

        // 创建扫码支付请求builder,设置请求参数
        AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()
            .setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setBody(body)
            .setStoreId(storeId)
            .setTimeoutExpress(timeoutExpress)
            .setNotifyUrl(AlipayUtils.RECHARGE_ALIPAY_NOTIFY);//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置

        AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);
        switch (result.getTradeStatus()) {
            case SUCCESS:
                AlipayTradePrecreateResponse response = result.getResponse();
                String  qrCode = response.getQrCode();
                RechargeOrderEntity rechargeOrder = new RechargeOrderEntity();
                rechargeOrder.setAmount(new BigDecimal(amount));
                rechargeOrder.setBuziType(RechargeOrderEntity.TYPE_ALI);
                rechargeOrder.setOutTradeNo(outTradeNo);
                rechargeOrder.setUserId(userId);
                rechargeOrder.setStatus("0");
                rechargeOrderService.save(rechargeOrder);
                if(rechargeOrder.getId() > 0){
                	return R.ok().put("qrCode", qrCode).put("outTradeNo", outTradeNo);
                }else{
                	return R.error("支付宝预下单失败!!!");
                }
            case FAILED:
            	return R.error("支付宝预下单失败!!!");
            case UNKNOWN:
            	return R.error("系统异常,预下单状态未知!!!");
            default:
            	return R.error("不支持的交易状态,交易返回异常!!!");
        }
	}

3、异步回调

/**
	 * 支付宝充值
	 * 支付结果获取有两种获取方式:1主动轮询查询状态;2通过异步通知。本充值是采用方式1主动轮询方式
	 */
	@PostMapping("asyncNotify.do")
	public void asyncNotify(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException{
		//获取支付宝POST过来反馈信息
    	Map paramsMap = buildParamsMap(request);
    	//商户订单号
    	String out_trade_no = paramsMap.get("out_trade_no");
    	//支付宝交易号
    	String trade_no = paramsMap.get("trade_no");
    	//交易状态
    	String trade_status = paramsMap.get("trade_status");
    	//订单金额 	
    	String total_amount = paramsMap.get("total_amount");
    	//卖家支付宝用户号
    	String seller_id = paramsMap.get("seller_id");
    	//开发者的app_id
    	String app_id = paramsMap.get("app_id");
    	//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
    	
		RechargeOrderEntity order = rechargeOrderService.queryObject(out_trade_no);
		if(order == null) {
			response.getWriter().write("failure");
    		return;
    	}
		//计算得出通知验证结果
		boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, Configs.getAlipayPublicKey(), AlipayUtils.INPUT_CHARSET,Configs.getSignType()); //调用SDK验证签名
    	if(signVerified){//验证成功
			//请在这里加上商户的业务逻辑程序代码
			if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
				//判断该笔订单是否在商户网站中已经做过处理
				//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
				//如果有做过处理,不执行商户的业务程序
    			String status = order.getStatus();
            	double order_total_amount = order.getAmount().doubleValue();
    			double ali_total_amount = Double.valueOf(total_amount);
    			if(! Configs.getAppid().equals(app_id) || ! Configs.getPid().equals(seller_id) || ! (order_total_amount == ali_total_amount)){
    				response.getWriter().write("failure");
    				return;
    			} 
    			if(StringUtils.equals(status, "1")) {
    				response.getWriter().write("success");
    				return;
    			} else if(StringUtils.equals(status, "0")) {
    				//买家支付宝账号 
    				//String payAccount = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"),"UTF-8");
    				//买家支付宝用户号
    				Map other = new HashMap();
    				other.put("buziId", out_trade_no);
    				other.put("id", order.getId());
    				ucenterAccountService.recharge(order.getAmount(), order.getUserId(), SaleOrderEntity.ZHIFUBAO, other);
    				response.getWriter().write("success");	//请不要修改或删除
    			}
			}else{
				response.getWriter().write("failure");
				return;
			}
		}else{
			response.getWriter().write("failure");
			return;
		}
	}

 

你可能感兴趣的:(支付)