java版支付宝支付

java当面付接入

说明:先在沙箱环境下测试生成支付二维码:
(沙箱环境链接:https://docs.open.alipay.com/200/105311/
然后在线上测试回调,给支付宝返回类似于”success“。

一:支付宝所需的配置参数
zfb.properities

# 支付宝网关名、partnerId和appId
#沙箱链接
#open_api_domain = https://openapi.alipaydev.com/gateway.do
#真实链接
open_api_domain = https://openapi.alipay.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
#此处请填写你当面付的APPID
#pid = 2088xxxxxxxxxxxx
#沙箱环境
#appid =2016xxxxxxxxxxxx


# RSA私钥、公钥和支付宝公钥
#此处请填写你的商户私钥且转PKCS8格式

#沙箱私钥
#private_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#此处请填写你的商户公钥

#沙箱
#public_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

#SHA1withRsa对应支付宝公钥
#alipay_public_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

#SHA256withRsa对应支付宝公钥
#沙箱
#alipay_public_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#真实alipay_public_key
alipay_public_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa,RSA2较RSA安全
sign_type = RSA2  
# 当面付最大查询次数和查询间隔(毫秒)
max_query_retry = 5
query_duration = 5000

# 当面付最大撤销次数和撤销间隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000

# 交易保障线程第一次调度延迟和调度间隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900

二:AliPayController

@RequestMapping(value = "/trade_precreate",
            method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<BaseResponse> trade_precreate(@RequestParam(value = "product_id") int product_id,
                                                        @RequestParam(value = "vendor_id") String vendor_id) {
        AlipayF2FPrecreateResult result = aliPayService.trade_precreate(product_id, vendor_id);
        switch (result.getTradeStatus()) {
            case SUCCESS:
                log.info("支付宝预下单成功: )");
                //生成订单:
                String outTradeNo=result.getResponse().getOutTradeNo();
                orderService.createdOrder(outTradeNo,vendor_id, product_id);

                AlipayTradePrecreateResponse response = result.getResponse();
                return new ResponseEntity<BaseResponse>(new BaseResponse(response), HttpStatus.OK);

            case FAILED:
                log.error("支付宝预下单失败!!!");
                return new ResponseEntity<BaseResponse>(new BaseResponse(ResponseCode.TRADE_PRECREATE_FAILED), HttpStatus.OK);

            case UNKNOWN:
                log.error("系统异常,预下单状态未知!!!");
                return new ResponseEntity<BaseResponse>(new BaseResponse(ResponseCode.SYSTEM_EXCEPTION), HttpStatus.OK);

            default:
                log.error("不支持的交易状态,交易返回异常!!!");
//                break;
                return new ResponseEntity<BaseResponse>(new BaseResponse(ResponseCode.NOT_SUPPORT_TRADE), HttpStatus.OK);
        }

    }

三:Service:

public AlipayF2FPrecreateResult trade_precreate(int product_id, String vendor_id){

        Configs.init("zfb.properties");

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

        // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
        tradeWithHBService = new AlipayTradeWithHBServiceImpl.ClientBuilder().build();

        /** 如果需要在程序中覆盖Configs提供的默认参数, 可以使用ClientBuilder类的setXXX方法修改默认参数 否则使用代码中的默认设置 */
        monitorService = new AlipayMonitorServiceImpl.ClientBuilder()
                .setGatewayUrl("http://mcloudmonitor.com/gateway.do").setCharset("GBK")
                .setFormat("json").build();
//        }

        // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
        // 需保证商户系统端不能重复,建议通过数据库sequence生成,
        String outTradeNo = "tradeprecreate" + System.currentTimeMillis()
                + (long) (Math.random() * 10000000L);

        // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
        String subject = "xxx品牌xxx门店当面付扫码消费";

        // (必填) 订单总金额,单位为元,不能超过1亿元
        // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
        String totalAmount = "0.01";

        // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
        // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
        String undiscountableAmount = "0";

        // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
        // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
        String sellerId = "";

        // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
        String body = "购买商品3件共20.00元";

        // 商户操作员编号,添加此参数可以为商户操作员做销售统计
        String operatorId = "test_operator_id";

        // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
        String storeId = "test_store_id";

        // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持
        ExtendParams extendParams = new ExtendParams();
        extendParams.setSysServiceProviderId("2088xxxxxxxxxx");

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

        // 商品明细列表,需填写购买商品详细信息,
        List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
        // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
        //查询商品信息
        com.chltec.entity.Product product=productService.getById(product_id);
        GoodsDetail goods1 = GoodsDetail.newInstance(String.valueOf(product.getId()), product.getTitle(),  (long)product.getSale_price(), 1);
        // 创建好一个商品后添加至商品明细列表
        goodsDetailList.add(goods1);

        AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()
                .setSubject(product.getTitle()).setTotalAmount(String.valueOf(product.getSale_price())).setOutTradeNo(outTradeNo)
//                .setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body)
//                .setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams)
                .setStoreId("store_id")
                .setTimeoutExpress(timeoutExpress)
                .setNotifyUrl("http://xxx.xxx.xxx/alipay/notify")//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置
                .setGoodsDetailList(goodsDetailList);

        AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);
        return result;
    }

四:支付回调:

@RequestMapping(value = "/notify",
            method = RequestMethod.POST)
    @ResponseBody
    public String notify(HttpServletRequest request,HttpServletResponse response) throws Exception{
        String result;
        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        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);
        }
        System.out.println("这个是>?:"+params);
        //商户订单号
        String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.ali_public_key, AlipayConfig.input_charset,"RSA2");
        if (flag)
        {
            //处理订单的业务逻辑...
            orderService.payed(out_trade_no);//修改订单为已支付状态
            result = "success";
            return result;
        } else {
            result = "RSACheckV1Error";
            log.error("AliPayController.Notify【验签失败】");
            return result;
        }
    }

参考支付宝官方文档demo:
https://docs.open.alipay.com/54/106370/(回调参考:JAVA服务端验证异步通知信息参数示例)
https://docs.open.alipay.com/194/105201/(当面付预创建订单demo)
更多功能(eg:退款,查询订单详情等)请参考支付宝的官方文档demo

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值