支付宝支付Java后台总结

原链接 https://www.cnblogs.com/jpfss/p/9289407.html

这个支付的流程是前端H5(APP等)需要支付时调用后台的接口拿到我们加密的签名去调起支付宝的支付界面(支付宝APP)进行支付操作,并且前端在支付成功后,支付宝后台会回调一个我们在签名时写入的一个接口地址进行支付结果的异步通知。

前置准备

  • 1、在整个编写过程中使用到的变量主要有私钥、公钥以及你的APPID(H5支付不需要),这些都是你在蚂蚁金服注册之后拿到的。
  • 2、使用到的jar包:

    • alipay-sdk-java*.jar—————————支付宝SDK编译文件jar
    • alipay-sdk-java*-source.jar——————支付宝SDK源码文件jar
    • commons-logging-1.1.1.jar——————SDK依赖的日志jar
    • commons-logging-1.1.1-sources.jar———SDK依赖的日志源码jar

      支付宝的SDK的jar包没有在maven repository里注册,因此要自己去官网上下载生成jar包并打进maven仓库里,懒得写的同学可以点击这里直接下载。

导入完jar包后,将支付宝中的 AppId、公钥、密钥等等的信息封装进配置类中

 

支付宝支付类型分别有三种:PC端支付、移动端支付、APP支付

 

PC端支付、调用的是 com.alipay.api.request.AlipayTradePagePayRequest 对象

AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();

移动端支付、调用的是 import com.alipay.api.request.AlipayTradeWapPayRequest 对象

AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();

App端支付、调用的是 import com.alipay.api.request.AlipayTradeAppPayRequest 对象

AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();

 

PC端和移动端支付 alipayRequest中设置的参数基本一致

App支付端的话 参数及流程如下

 

代码

获取签名的接口

@ResponseBody
@RequestMapping(value="/alipaySign",method=RequestMethod.POST)
public JSONObject signprams(Double totalAmount,String userId,String out_trade_no){
    String subject = "Your Subject";        //主题
    String body = "Your Body";              //主题内容
    String CHARSET = "utf-8";

    /**
     * 实例化客户端
     */
    AlipayClient alipayClient = new DefaultAlipayClient
    (PayConstants.Ali_Open_Api_Domain,PayConstants.Ali_AppId,
        PayConstants.ALI_PRIVATE_KEY,"json",CHARSET,PayConstants.ALI_PUBLIC_KEY,"RSA2");
    //实例化具体API对应的request类,类名称和接口名称对应
    AlipayTradeAppPayRequest alirequest = new AlipayTradeAppPayRequest();
    //sdk中的model入参
    AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
    model.setPassbackParams(body);      //描述信息,添加附加数据
    model.setSubject(subject);          //商品标题
    model.setOutTradeNo(out_trade_no);  //订单号
    model.setTimeoutExpress("30m");     //超时关闭该订单时间
    model.setTotalAmount(Double.toString(totalAmount));     //将double数值转换成String类
    model.setProductCode(PayConstants.Ali_ProductCode);
    alirequest.setBizModel(model);
    alirequest.setNotifyUrl(PayConstants.Ali_Notify_Url);   //回调地址

    String orderStr = "";
    try {
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(alirequest);
        orderStr = response.getBody();
    } catch (AlipayApiException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    String sign = DigestUtils.md5Hex(out_trade_no).toUpperCase();

    /处理你自己的逻辑/

    JSONObject resObj = new JSONObject();
    resObj.put("code", "SUCCESS");
    resObj.put("out_trade_no", out_trade_no);
    resObj.put("sign", sign);
    resObj.put("orderStr",orderStr);
    System.out.println(resObj.toJSONString());
    System.out.println(resObj.toString());
    return resObj;
}

 

回调的接口 
回调的地址一定要保证是外网的地址,内网开发地址因为防火墙的限制不一定能访问到。

@ResponseBody
@RequestMapping(value="/alipayNotify",method=RequestMethod.POST)
public String getNotify(HttpServletRequest request){
    Map requestParams = request.getParameterMap();
    logger.info("支付宝支付结果通知:"+requestParams.toString());
    //获取支付宝POST过来反馈信息
    Map<String,String> params = new HashMap<String,String>();

    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] + ",";
            logger.info(valueStr);
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
    }

    ///处理自己的逻辑//

    try {
        boolean flag = AlipaySignature.rsaCheckV1
        (params, PayConstants.ALI_PUBLIC_KEY, "UTF-8", "RSA2");
        if(flag){
            if("TRADE_SUCCESS".equals(params.get("trade_status")))

        }
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    return "SUCCESS";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值