支付的那些套路(手机支付宝篇)

安卓和IOS的支付方式是不一样的,安卓走接口,IOS走内购,官方文档写的还算能够,安卓的基本套路是这样的:java

so:根据阿里提供的文档拼接参数数据库

Map<String, String> paramMap = new HashMap<String, String>();
            paramMap.put("app_id", PayPropertiesUtils.getString("alipay.appPay.appId"));
            paramMap.put("method", PayPropertiesUtils.getString("alipay.appPay.method"));
            paramMap.put("format", PayPropertiesUtils.getString("alipay.appPay.format"));
            paramMap.put("charset", PayPropertiesUtils.getString("alipay.inputCharset"));
            //发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"	2014-07-24 03:07:50
            paramMap.put("timestamp", UtilDate.getDateFormatter());
            paramMap.put("version", PayPropertiesUtils.getString("alipay.appPay.version"));
            paramMap.put("notify_url", PayPropertiesUtils.getString("alipay.appPay.notifyUrl"));
            //业务对象
            Map<String, String> bizContentMap = new HashMap<String, String>();
            bizContentMap.put("body", GlobalConstants.PAY_PRODUCT_NAME);
            bizContentMap.put("subject", GlobalConstants.PAY_PRODUCT_NAME);
            bizContentMap.put("out_trade_no", payExtendVo.getOrderId());
            bizContentMap.put("timeout_express",PayPropertiesUtils
            .getString("alipay.appPay.timeoutExpress"));
            bizContentMap.put("total_amount", String.valueOf(payExtendVo.getPayAmount()));
            bizContentMap.put("product_code", PayPropertiesUtils
            .getString("alipay.appPay.productCode"));
            String biz_content = JSON.toJSONString(bizContentMap);
            paramMap.put("biz_content", biz_content);
            String sign_type =  PayPropertiesUtils.getString("alipay.appPay.signType");
            paramMap.put("sign_type",sign_type);
            //去除空值
            Map<String,String> signMap = AlipayCore.paraAppFilter(paramMap);
            //生成签名
            String sign = Signature.buildRequestMysign(signMap,sign_type,RSA_PRIVATE_KEY);
            sign = URLEncoder.encode(sign,"utf-8");
            signMap.put("sign", sign);
            //获取业务参数串
            String reqOrderStr = AlipayCore.createLinkString(signMap);

而后篇拼接返回给App的参数:express

Map returnMap = new HashMap();
            returnMap.put("reqPayUrl", reqOrderStr);
            returnMap.put("orderId",payExtendVo.getOrderId());
            returnMap.put("payAmount",tradeLog.getPayAmount());
            returnMap.put("income",tradeLog.getIncome());
            returnMap.put("rewardFanpiao",tradeLog.getRewardFanpiao());
            returnMap.put("incomeAmount",tradeLog.getIncomeAmount());
            resultBean.setData(returnMap);

最后存库,支付状态是待支付。服务器

手机端经过SDK调用以后根据订单ID请求服务器支付状态。app

接下来是阿里给服务器的回调,若是代码理由AOP或者拦截提早排除掉这个请求:ui

首先解析参数 :url

Map<String, String> checkParamsMap = new HashMap<String,String>();
            Map requestParams = thridPartyNotifyVo.getAliPayRequestParamsMap();
            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] + ",";
                }
                //乱码解决,这段代码在出现乱码时使用。若是mysign和sign不相等也能够使用这段代码转化
                //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
                checkParamsMap.put(name, valueStr);
            }

而后验证参数是否和合法,是否是从阿里发出来的,能够调用阿里给的demo里的方法:code

AlipayNotify.verify(checkParamsMap,PayPropertiesUtils.getString("alipay.appPay.signType"),PayPropertiesUtils.getString("alipay.appPay.alipayPublicKey"))

若是是true:更数据库的状态:最后给支付宝一个success,告诉支付宝回调已成功。orm

相关文章
相关标签/搜索