java支付宝app支付代码

来源:互联网 发布:手机淘宝号怎么注册 编辑:程序博客网 时间:2024/05/16 19:35

刚刚接触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 = "2017110809809345";       //支付宝回调地址     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支付逻辑了,加签和验签的方法支付宝都封装好了,不需要我们自己写

原创粉丝点击