安卓和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