支付宝app支付(Java)

pom:


注意:

1.回调接口中,produces类型很重要

2.@ApiOperation/@ApiParam为swagger注解

3.支付宝配置中    

    privateKey为应用私钥,即使用支付宝工具生成的私钥,取pkcs8.pem结尾的文件中的值

    publicKey为支付宝公钥此处应区分与应用私钥的区别,在开放平台-密钥管理-查看支付宝公钥


两个接口:

1.生成支付单接口(返回给前端拉起支付宝)

controller示例:

@RequestMapping(value ="/payorder/for/{billNo}",method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

@ResponseBody

@ApiOperation(value ="获取支付单",httpMethod ="GET",response = AlipayTradeAppPayResponse.class)

public JsonResultResponsegetPayOrder(@ApiParam(name ="billNo",value ="billNo")@PathVariable String billNo,

                                      HttpServletRequest request){

String userId = request.getHeader(HTTP_HEAD_KEY);

return JsonResultResponse.buildJsonResultResponse(alipayService.getPayOrder(billNo,userId));

}

service示例

//构建支付订单

AlipayClient alipayClient =new DefaultAlipayClient(AlipayConfig.ALI_OPEN_API_GATEWAY, AlipayConfig.appid,AlipayConfig.privatekey,

        AlipayConfig.format,AlipayConfig.charset,AlipayConfig.publickey, AlipayConfig.signType);

AlipayTradeAppPayRequest request =new AlipayTradeAppPayRequest();

AlipayTradeAppPayModel model =new AlipayTradeAppPayModel();

//RMB分转元

BigDecimal paiedAmt = RMBCentToDollar(getPaid(tradeOrderVo.getTotalAmount(),tradeOrderVo.getDiscountAmount()));

model.setSubject("支付宝支付");

model.setOutTradeNo(billNo);

model.setTimeoutExpress("30m");

model.setTotalAmount(paiedAmt.toString());    //单位为yuan

//model.setProductCode();

request.setBizModel(model);

request.setNotifyUrl(AlipayConfig.notifyurl);

AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

2.支付宝回调接口:

controller示例
@RequestMapping(value ="/notify",method = RequestMethod.POST,produces = MediaType.TEXT_PLAIN_VALUE)

@ResponseBody

@ApiOperation(value ="支付宝回调",httpMethod ="POST")

public StringaliNotify(HttpServletRequest request){

try {

return alipayService.aliNotify(request);

    }catch (AlipayApiException e) {

logger.error(e.getMessage(),e);

        return e.getMessage();

    }catch (UnsupportedEncodingException e) {

logger.error(e.getMessage(),e);

    return e.getMessage();

    }

}

service示例

public StringaliNotify(HttpServletRequest request)throws AlipayApiException, UnsupportedEncodingException {

//获取参数

        Map requestParams = request.getParameterMap();

        logger.info("aliNotify request parameterMap: [{}]",JsonUtils.toJSON(requestParams));

        Map params =new HashMap<>();

        for (Iterator iterator = requestParams.keySet().iterator(); iterator.hasNext(); ) {

String name = (String) iterator.next();

            String[] valueArray = (String[]) requestParams.get(name);

            String values ="";

            for (int i =0; i < valueArray.length; i++) {

values = (i == valueArray.length -1) ? values + valueArray[i]

: values + valueArray[i] +",";

            }

//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化

//            values = new String(values.getBytes("ISO-8859-1"), "gbk");

            params.put(name, values);

        }

logger.info("aliNotify request params:[{}]", JSONUtils.toJSONString(params));

        boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.publickey, AlipayConfig.charset, AlipayConfig.signType);

        logger.info("ali pay check signature :flag [{}]",flag);

        if(!flag) {

logger.error("invalid signature");

            return FAIL;

        }

//业务处理

return SUCCESS;

}

3:附-支付结果查询接口

controller:

@RequestMapping(value ="/resultquery",method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

@ResponseBody

@ApiOperation(value ="支付结果查询",httpMethod ="GET",response = PaymentPo.class)

public JsonResultResponsequeryPayResult(@ApiParam(name ="billNo",value ="billNo")@RequestParam String billNo,

                                        HttpServletRequest request){

    return JsonResultResponse.buildJsonResultResponse(alipayService.queryPayResult(billNo));

}

service:

//主动查询订单状态

AlipayClient alipayClient =new DefaultAlipayClient(AlipayConfig.ALI_OPEN_API_GATEWAY, AlipayConfig.appid,AlipayConfig.privatekey,

        AlipayConfig.format,AlipayConfig.charset,AlipayConfig.publickey, AlipayConfig.signType);

AlipayTradeQueryRequest request =new AlipayTradeQueryRequest();

AlipayTradeQueryModel model =new AlipayTradeQueryModel();

model.setOutTradeNo(billNo);

request.setBizModel(model);

AlipayTradeQueryResponse response = alipayClient.execute(request);

logger.info("alipapy query order response:[{}]",response);

if(!response.isSuccess()){

logger.error("alipay query order response error. response code:[{}] msg:[{}]",response.getCode(),response.getMsg());

    throw new Exception("alipay query order response error");

}

//交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)

String tradeStatus = response.getTradeStatus().toUpperCase();

//业务处理

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