java支付宝app支付代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39053211/article/details/78695707

刚刚接触app支付宝支付的时候还是走了很多弯路的,希望看到的小伙伴们别要走那么多弯路。
最好以支付宝(蚂蚁金服)提供的文档和API去开发,网上别人写的一些加签方式,可能并不好用。
下面这个地址为App支付请求参数说明:
https://docs.open.alipay.com/204/105465/
还有支付宝的SDK下载地址:
https://docs.open.alipay.com/54/103419
把压缩包解压,之后就是这样:这里写图片描述
打开readme.txt
这里写图片描述
把这两个jar包导入你们自己的项目里面,就可以直接用支付宝的加签方式了,根本就不需要你们自己写的,我就是这个走了不少弯路。
下面就上代码了:

public class AlipayConfig  {

    // 合作身份者ID,以2088开头由16位纯数字组成的字符串
    public static String partner = "2088*********4";

 // 6.请求网关地址
    public static String URL = "https://openapi.alipay.com/gateway.do";    

    public static String service = "mobile.securitypay.pay";//固定值

    public static String seller_id = "*******@163.com";
    //私钥
    public static String private_key = "";
    // 商户的公钥钥
    public static String public_key ="";
    // 支付宝的公钥,无需修改该值(不要删除也不要修改,在接收通知的时候需要进行签名认证)
    public static String ali_public_key= "";

    // 字符编码格式 目前支持 gbk 或 utf-8
    public static String input_charset = "utf-8";
    // 签名方式 不需修改
    public static String sign_type = "RSA";

    //APPID
    public static String APPID = "****************";    
   //支付宝回调地址 
    public static String notify_url = "";

    // 8.返回格式
   public static String FORMAT = "json" 

关于支付宝的回调地址提供给你们一个可以穿透内网的工具:
https://natapp.cn/
通过这个网址获得一个地址,来穿透内网,测试一个支付宝支付还是可以的,具体的操作可以自行百度一下,还是比较简单的。


         String orderStr="";
         try {
             Map<String, String> orderMap = new LinkedHashMap<String, String>(); // 订单实体
                Map<String, String> bizModel = new LinkedHashMap<String, String>(); // 公共实体
                /****** 2.商品参数封装开始 *****/ // 手机端用
                // 商户订单号,商户网站订单系统中唯一订单号,必填
                orderMap.put("out_trade_no", orderPayRequest.getOrderId());
                // 订单名称,必填
                orderMap.put("subject", "***支付");
                // 付款金额,必填
                orderMap.put("total_amount", String.valueOf(orderPayRequest.getActualPayMoney()));
                // 销售产品码 必填
                orderMap.put("product_code", "QUICK_WAP_PAY");
                /****** --------------- 3.公共参数封装 开始 ------------------------ *****/ // 支付宝用
                // 1.商户appid
                bizModel.put("app_id", AlipayConfig.APPID);
                // 2.请求网关地址
                bizModel.put("method", AlipayConfig.URL);
                // 3.请求格式
                bizModel.put("format", AlipayConfig.FORMAT);
                // 4.回调地址
                bizModel.put("return_url", AlipayConfig.notify_url);
                // 5.私钥
                bizModel.put("private_key", AlipayConfig.private_key);
                // 6.商家id
                bizModel.put("seller_id", AlipayConfig.partner);
                // 7.加密格式
                bizModel.put("sign_type", AlipayConfig.sign_type + "");
                /****** --------------- 3.公共参数封装 结束 ------------------------ *****/
                // 实例化客户端
                AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
                        AlipayConfig.private_key, AlipayConfig.FORMAT, AlipayConfig.input_charset,
                        AlipayConfig.ali_public_key, AlipayConfig.sign_type);
                // 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
                AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
                // SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
                AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
                // model.setPassbackParams(URLEncoder.encode((String)orderMap.get("body").toString()));;
                // //描述信息 添加附加数据
                // model.setBody(orderMap.get("body")); //商品信息
                model.setSubject(orderMap.get("subject")); // 商品名称
                model.setOutTradeNo(orderMap.get("out_trade_no")); // 商户订单号(自动生成)
                model.setTotalAmount(orderMap.get("total_amount")); // 支付金额
                model.setProductCode(orderMap.get("product_code")); // 销售产品码
                model.setSellerId(AlipayConfig.partner); // 商家id
                ali_request.setBizModel(model);
                ali_request.setNotifyUrl(AlipayConfig.notify_url); // 回调地址
                AlipayTradeAppPayResponse responses = client.sdkExecute(ali_request);
                 orderStr = responses.getBody();
                System.err.println(orderStr); // 就是orderString 可以直接给客户端请求,无需再做处理
        } catch (Exception e) {
            e.printStackTrace();
        }

         return orderStr;

把得到的加了签的字符串给前端就好了,让他们直接去调用支付宝去支付,
还有一个支付宝回调的方法,这个方法并不需要前端访问,而是支付宝回调的:
这个方法的路径,就是支付宝的回调地址,当然了,你得让支付宝能访问你这个方法,内网测试就得用到刚刚用工具得到的地址来测试了:把这个加到刚刚得到的地址后面就好了:比如
http://3gtdkc.natappfree.cc/“项目名字”/order-pay-notify-controller

@RequestMapping(value = "/order-pay-notify-controller", method = {RequestMethod.POST,RequestMethod.GET })
    public void notify(@RequestBody String body, HttpServletRequest requests, HttpServletResponse httpServletResponse)
            throws IOException {
    // 1.从支付宝回调的request域中取值
        Map<String, String[]> requestParams = requests.getParameterMap();
        System.out.println("从支付宝回调的request域中取值:requestParams===================================" + requestParams);
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = iter.next();
            String[] values = requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
            }
            // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        // 2.封装必须参数
        String out_trade_no = requests.getParameter("out_trade_no"); // 商户订单号
        System.err.println("out_trade_no==================================" + out_trade_no);
        String orderType = requests.getParameter("body"); // 订单内容
        System.out.println("orderType==================================" + orderType);
        String tradeStatus = requests.getParameter("trade_status"); // 交易状态
        System.err.println("tradeStatus=================================" + tradeStatus);
        // 3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
        boolean signVerified = false;
        try {
            // 3.1调用SDK验证签名
            signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ali_public_key, AlipayConfig.input_charset);
            System.out.println(signVerified);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
        // 4.对验签进行处理
if (signVerified) { // 验签通过
if (tradeStatus.equals("TRADE_SUCCESS")) {// 只处理支付成功的订单:修改交易表状态,支付成功

下面的就是你们自己的业务逻辑了 :
成功和失败以后的逻辑了

好了,这就是支付宝app支付逻辑了,加签和验签的方法支付宝都封装好了,不需要我们自己写

猜你喜欢

转载自blog.csdn.net/weixin_39053211/article/details/78695707
今日推荐