支付宝扫码需要开通特定权限,拼接参数有些许不同,页面上的二维码如果是内嵌的就让H5自己去生成,订单和请求字符串服务端生成:
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("service",PayPropertiesUtils.getString("alipay.scanCodePay.service"));
paramMap.put("partner",PayPropertiesUtils.getString("alipay.scanCodePay.partner"));
paramMap.put("_input_charset",PayPropertiesUtils.getString("alipay.inputCharset"));
paramMap.put("notify_url",PayPropertiesUtils.getString("alipay.scanCodePay.notifyUrl"));
if(StringUtils.isBlank(payExtendVo.getReturnUrl())) {
if(!StringUtils.isBlank(paymentTypeEnum.getReturnUrlPropName())) {
paramMap.put("return_url",PayPropertiesUtils.getString(paymentTypeEnum.getReturnUrlPropName()));
}
} else {
paramMap.put("return_url",payExtendVo.getReturnUrl());
}
paramMap.put("out_trade_no",payExtendVo.getOrderId());
paramMap.put("subject", GlobalConstants.PAY_PRODUCT_NAME);
paramMap.put("payment_type", PayPropertiesUtils.getString("alipay.scanCodePay.paymentType"));
paramMap.put("total_fee", String.valueOf(payExtendVo.getPayAmount()));
paramMap.put("seller_id", PayPropertiesUtils.getString("alipay.scanCodePay.partner"));
paramMap.put("seller_email", PayPropertiesUtils.getString("alipay.scanCodePay.sellerEmail"));
paramMap.put("body", GlobalConstants.PAY_PRODUCT_NAME);
//show_url 收银台页面上,商品展示的超链接。可空
//paymethod 取值范围: creditPay(信用支付) directPay(余额支付) 如果不设置,默认识别为余额支付。
//enable_paymethod 支付渠道 用于控制收银台支付渠道显示,该值的取值范围请参见支付渠道。 可支持多种支付渠道显示,以“^”分隔。可空
//anti_phishing_key 防钓鱼时间戳
//exter_invoke_ip 防钓鱼保护时必填写
//extra_common_param 公用回传参数 可控
//token 如果开通了快捷登录产品,则需要填写;如果没有开通,则为空。
//need_buyer_realnamed 是否需要买家实名认证 T表示需要买家实名认证; 不传或者传其它值表示不需要买家实名认证。可空
//hb_fq_param 花呗分期参数
paramMap.put("it_b_pay", PayPropertiesUtils.getString("alipay.scanCodePay.itBPay"));
paramMap.put("qr_pay_mode", PayPropertiesUtils.getString("alipay.scanCodePay.qrPayMode"));
//商户自定二维码宽度 当qr_pay_mode=4时,该参数生效。
if(StringUtils.isNotBlank(payExtendVo.getQrcodeWidth())) {
paramMap.put("qrcode_width",payExtendVo.getQrcodeWidth());
}
paramMap.put("goods_type",PayPropertiesUtils.getString("alipay.scanCodePay.goodsType"));
logger.info("alipayScanCodePayService----thridPartyPayCall-----");
//去除空值
Map<String,String> signMap = AlipayCore.paraAppFilter(paramMap);
//生成签名
String sign = Signature.buildRequestMysign(signMap,PayPropertiesUtils.getString("alipay.scanCodePay.signType"), PayPropertiesUtils.getString("alipay.scanCodePay.md5Key"));
signMap.put("sign",sign);
logger.info("alipayScanCodePayService----thridPartyPayCall-----sign="+sign);
//获取业务参数串
String payReqStr = PayPropertiesUtils.getString("alipay.scanCodePay.requestUrl") + AlipayCore.createLinkString(signMap);
logger.info("alipayScanCodePayService----thridPartyPayCall-----payReqStr=" + payReqStr);
Map returnMap = new HashMap();
returnMap.put("scanCodeUrl",payReqStr);
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);
//存库
支付宝的回调跟手机端回调差不多:
String tradeStatus = String.valueOf(thridPartyNotifyVo.getAlipayTradeStatus());
try {
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);
}
if (AlipayNotify.verify(checkParamsMap,PayPropertiesUtils.getString("alipay.scanCodePay.signType"),PayPropertiesUtils.getString("alipay.scanCodePay.md5Key"))) { //验证响应请求正确
if(!"TRADE_FINISHED".equals(tradeStatus) && !"TRADE_SUCCESS".equals(tradeStatus)) { //支付失败
resultBean = new ResultBean(ResultCode.PayAlipayNotifyIsPayFail.get_code(),ResultCode.PayAlipayNotifyIsPayFail.getMsg()+";返回误码:"+tradeStatus, NOTFIY_EXCEPTION_IS_HANDLER);
}
} else {
resultBean = new ResultBean(ResultCode.UNSUCCESS.get_code(),ResultCode.PayAlipayNotifyIsNotValidUrl.getMsg()+";返回码:"+tradeStatus, NOTFIY_EXCEPTION_IS_NOT_HANDLER);
}
//更余额
最后别忘了返回支付宝一个success,要不他一直发