公众号等相关配置请参考博客:微信支付详解.
// ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ H5支付配置参数 ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
//微信H5支付类型
public static String h5_trade_type=ResourceBundle.getBundle("wpay").getString("h5_trade_type");
//微信H5网页支付成功回调页
public static String redirect_url = PathUtil.GetDemain()+ ResourceBundle.getBundle("wpay").getString("redirect_url");
//异步通知地址
public static String wy_notify_url = PathUtil.GetDemain()+ResourceBundle.getBundle("wpay").getString("wy_notify_url");
//公众账号id
public static String gz_id = ResourceBundle.getBundle("wpay").getString("gz_id");
//公众号对应绑定的商户号id
public static String gz_mch_id = ResourceBundle.getBundle("wpay").getString("gz_mch_id");
//H5使用商户号对应商户平台 Api key密钥
public static String WYKey = ResourceBundle.getBundle("wpay").getString("WYKey");
/**
* 商品描述交易字段格式根据不同的应用场景按照以下格式:
* APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。
*/
public static String body = "开通正式版";
//客户端ip,固定为此值
public static String spbill_create_ip = "127.0.0.1";
//支付类型 固定值 APP
public static String trade_type = "APP";
//固定值 Sign=WXPay
public static String PACKAGE = "Sign=WXPay";
//微信统一下单接口请求地址 固定值
public static String wxUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ H5支付配置参数 ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
/**
* 微信H5支付
* 用户选择需要购买的产品点击微信支付 处理自身业务 然后向微信发起下单请求(统一下单接口)
* 1、用户在商户侧完成下单,使用微信支付进行支付
* 2、由商户后台向微信支付发起下单请求(调用统一下单接口)注 trade_type=MWEB
* @param request
* @param uid 用户ID
* @param cid 套餐ID
* @param map 返回页面的数据 map承装
* @return map
* @throws IOException 异常
*/
@RequestMapping("getwyorder")
public void wx_PayBefore(HttpServletRequest request,HttpServletResponse response,String uid,String cid,Map<String,Object> map) throws IOException{
log.info("uid=============="+uid);
Users p = users.FindUsers(uid);
if(p!=null){
StringBuilder mweb_url = new StringBuilder();
Combo token = com.findcomboById(cid);
String ip = request.getRemoteAddr();
log.info("ip:"+ip);
//重点 处理自身业务 然后调用统一下单生成预支付交易信息 通过mweb_url发起微信支付
//即对应文档中:
// 1、用户在商户侧完成下单,使用微信支付进行支付
// 2、由商户后台向微信支付发起下单请求(调用统一下单接口)
Map<String,Object> map_wy = wxPayService.beforePayTwo(uid, cid,ip);
if(map_wy!=null){
if(map_wy.get("mweb_url")!=null){
mweb_url.append(map_wy.get("mweb_url"));
//正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数
//注意:
//1.需对redirect_url进行urlencode处理
//2.由于设置redirect_url后,回跳指定页面的操作可能发生在:
// 1,微信支付中间页调起微信收银台后超过5秒
// 2,用户点击“取消支付“或支付完成后点“完成”按钮。因此无法保证页面回跳时,支付流程已结束,
// 所以商户设置的redirect_url地址不能自动执行查单操作,应让用户去点击按钮触发查单操作。
mweb_url.append("&redirect_url="+URLEncoder.encode(WxPayConfig.redirect_url+"?str="+map_wy.get("order_id"), "UTF-8"));
log.info("=============="+mweb_url);
//3、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url调起微信支付中间页
//4、中间页进行H5权限的校验,安全性检查
//此处为了体验度没有直接跳转页面 正确的步骤是将 mweb_url 参数携带跳转到一个页面 ,在该页面点击支付请求mweb_url地址
response.sendRedirect(mweb_url+"");
}
}
}
}
/**
* H5微信支付-回调页面 用户支付完成后返回至指定页面
* 正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数
* 需对redirect_url进行urlencode处理
* 6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)
* 7、商户在展示页面,引导用户主动发起支付结果的查询
* @param str 订单号
* @return
*/
@RequestMapping("wx_wy_after")
public String wx_yw_after(String str,Map