This commit is contained in:
Paidax
2025-03-11 08:42:14 +08:00
parent 7f02dffebe
commit f822ef2046
12 changed files with 541 additions and 3 deletions
@@ -18,6 +18,8 @@ public class RedisConstant {
//企业微信TOKEN
public final static String REDIS_KEY_QIYE_WECHAT_ACCESS_TOKEN = "qiyewx:token:";
// 微信公众号TOKEN
public final static String REDIS_KEY_WECHAT_ACCESS_TOKEN = "wechat:token:";
//健步走小程序TOKEN
public final static String REDIS_KEY_WE_APP_ACCESS_TOKEN = "weapp:token:";
@@ -49,6 +49,11 @@ public class PaymentTransaction extends BaseModel {
@ColDefine(type = ColType.VARCHAR,width = 30)
private String tradingType;
@Column
@Comment("交易状态")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String tradingState;
@Column
@Comment("用户ID")
@ColDefine(type = ColType.VARCHAR,width = 32)
@@ -16,6 +16,12 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class WxPayV3Bean {
/**
* 服务号
* appid: wxf12fa6175ec7c75f
* app_secret: f65bbb41d3de4a93c8c93d8e2fd50369
*/
private String appId;
private String keyPath;
private String publicKeyPath;
@@ -0,0 +1,37 @@
package io.v.nutz.base.payment.wxpay.controller;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.payment.wxpay.service.WxPayCommonService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @Author zzr
* @name:WxPayCommonController
* @Date 2025/3/10 19:28
* @注释
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/wxPay")
public class WxPayCommonController {
@Inject
private WxPayCommonService wxPayCommonService;
@At
@Ok("void")
@ViReturn
public void notifyMessage(HttpServletRequest request, HttpServletResponse response){
wxPayCommonService.payNotify(request, response);
}
}
@@ -66,4 +66,12 @@ public interface WxPayCommonService {
* @param response 响应
*/
void refundNotify(HttpServletRequest request, HttpServletResponse response);
/**
* 获取openId
* @param code 用户授权后的Code,可以获取用户信息
* @return
*/
String getOpenId(String code);
}
@@ -20,18 +20,24 @@ import com.ijpay.wxpay.enums.WxDomainEnum;
import com.ijpay.wxpay.enums.v3.BasePayApiEnum;
import com.ijpay.wxpay.model.v3.*;
import io.v.nutz.base.payment.enums.TradingChannelEnum;
import io.v.nutz.base.payment.enums.TradingStateEnum;
import io.v.nutz.base.payment.enums.TradingTypeEnum;
import io.v.nutz.base.payment.enums.WxPayResultCode;
import io.v.nutz.base.payment.model.PaymentTransaction;
import io.v.nutz.base.payment.wxpay.bean.WxPayV3Bean;
import io.v.nutz.base.payment.wxpay.service.WxPayCommonService;
import io.v.nutz.base.payment.wxpay.util.WeChatUtils;
import io.v.nutz.base.payment.wxpay.vo.WxPayNeedParamVo;
import io.v.nutz.base.result.Result;
import io.v.nutz.sys.models.User;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.random.R;
@@ -85,6 +91,8 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
@Inject
private SysUserService sysUserService;
@Inject
private WeChatUtils weChatUtils;
/**
* 微信扫描二维码支付
@@ -93,6 +101,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
* @return
*/
@Override
@Aop(TransAop.READ_COMMITTED)
public Result nativePay(WxPayNeedParamVo paramVo) {
try {
// 商户订单号,存储当前用户的订单
@@ -148,6 +157,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
@Override
@Aop(TransAop.READ_COMMITTED)
public Result jsApiPay(WxPayNeedParamVo paramVo) {
try {
// 商户订单号,存储当前用户的订单
@@ -187,7 +197,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
Map<String, String> map = WxPayKit.jsApiCreateSign(WX_PAY_V3_BEAN.getAppId(), prepayId, WX_PAY_V3_BEAN.getKeyPath());
log.info("唤起支付参数:{}", map);
// 唤起支付成功,向数据库插入订单参数
insertTradingOrder(paramVo, outTradeNo, body);
return Result.success(JSONUtil.toJsonStr(map));
}
// return JSONUtil.toJsonStr(response);
@@ -200,6 +210,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
@Override
@Aop(TransAop.READ_COMMITTED)
public Result wapPay(WxPayNeedParamVo paramVo) {
try {
// 商户订单号,存储当前用户的订单
@@ -238,10 +249,11 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
log.info("verifySignature: {}", verifySignature);
if (response.getStatus() == OK && verifySignature) {
String body = response.getBody();
insertTradingOrder(paramVo, outTradeNo, body);
return Result.success(JSONUtil.toJsonStr(body));
}
// return JSONUtil.toJsonStr(response);
return null;
return Result.error();
} catch (Exception e) {
log.error("系统异常", e);
return Result.error(e.getMessage());
@@ -276,8 +288,21 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
// WX_PAY_V3_BEAN.getApiKey3(), WX_PAY_V3_BEAN.getPlatformCertPath());
// }
log.info("支付通知明文 {}", plainText);
if (StrUtil.isNotEmpty(plainText)) {
// 支付结果
JSONObject jsonResult = JSONUtil.parseObj(plainText);
// 获取缴费记录,并修改缴费结果
PaymentTransaction transaction = sysUserService.dao().fetch(PaymentTransaction.class, Cnd.where("outTradeNo", "=", jsonResult.getStr("out_trade_no")));
transaction.setTradingState(TradingStateEnum.PAY_SUCCESS.getTrdingStateName());
transaction.setTradingOrderNo(jsonResult.getStr("transaction_id"));
sysUserService.dao().update(transaction);
sysUserService.dao().update(MemberPaymentInfo.class,
Chain.make("isPayment", true).add("paymentTime", DateUtil.date(jsonResult.getLong("success_time")))
.add("paymentMoney", String.valueOf(transaction.getTradingOrderNo())),
Cnd.where("payId", "=", transaction.getId())
);
response.setStatus(200);
map.put("code", "SUCCESS");
map.put("message", "SUCCESS");
@@ -285,7 +310,10 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
response.setStatus(500);
map.put("code", "ERROR");
map.put("message", "签名错误");
log.error("签名错误");
}
// 支付回调,返回给微信,自己也接收不到结果,这里的返回完全没用
response.setHeader("Content-type", ContentType.JSON.toString());
response.getOutputStream().write(JSONUtil.toJsonStr(map).getBytes(StandardCharsets.UTF_8));
response.flushBuffer();
@@ -404,6 +432,12 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
}
@Override
public String getOpenId(String code) {
JSONObject jsonObject = weChatUtils.getWebAccessTokenAndOpenid(code);
return jsonObject.getStr("openid");
}
/**
* 公共方法,获取证书序列号
* @return
@@ -522,6 +556,7 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
transaction.setUserName(user.getUsername());
transaction.setUnitName(user.getUnitname());
transaction.setUnionName(user.getUnionname());
transaction.setTradingState(TradingStateEnum.WAITING_FOR_PAYMENT.name());
// 获取订单金额
int total = paramVo.getAmount().getTotal();
BigDecimal bigDecimalValue = new BigDecimal(String.valueOf(total));
@@ -534,5 +569,8 @@ public class WxPayCommonServiceImpl implements WxPayCommonService {
transaction.setOpenId(null);
transaction.setResultJson(result);
sysUserService.dao().insert(transaction);
sysUserService.dao().update(MemberPaymentInfo.class,
Chain.make("payId", transaction.getId()), Cnd.where("id", "=", paramVo.getMemberPaymentInfoId()));
}
}
@@ -0,0 +1,109 @@
package io.v.nutz.base.payment.wxpay.util;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.v.nutz.base.constant.RedisConstant;
import lombok.extern.slf4j.Slf4j;
import org.nutz.http.Http;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import java.net.URLEncoder;
/**
* @version 1.0
* @Author zzr
* @name:WeChatUtils
* @Date 2025/3/10 14:13
* @注释
*/
@Slf4j
@IocBean
public class WeChatUtils {
@Inject
private RedisService redisService;
public static final String APPID = "wxf12fa6175ec7c75f";
public static final String SECRET = "f65bbb41d3de4a93c8c93d8e2fd50369";
// 获取code
public final static String CODE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
//获取网页access_token的接口地址
public final static String WEB_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
//获取用户信息地址
public final static String USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
// 获取access_token的接口地址(GET) 限2000(次/天)
public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
// 发送模板消息
public static final String SEND_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
/**
* 生成获取code的url
*
* @param redirectUrl
* @return
*/
public String getCodeUrl(String redirectUrl, String state) {
String requestUrl = null;
state = state == null ? "" : state;
try {
requestUrl = CODE_URL.replace("APPID", APPID).replace("REDIRECT_URI", URLEncoder.encode(redirectUrl, "UTF-8")).replace("STATE", state);
} catch (Exception e) {
e.printStackTrace();
}
return requestUrl;
}
/**
* 获取微信网页access_token 和 openid
*
* @param code
* @return
*/
public JSONObject getWebAccessTokenAndOpenid(String code) {
String requestUrl = WEB_ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", SECRET).replace("CODE", code);
return JSONUtil.parseObj(HttpUtil.post(requestUrl, new JSONObject()));
}
/**
* 网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了
* <a href="https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html">...</a>
*
* @param webAccessToken
* @param openid
* @return
*/
public JSONObject getUserInfo(String webAccessToken, String openid) {
String requestUrl = USERINFO_URL.replace("ACCESS_TOKEN", webAccessToken).replace("OPENID", openid);
return JSONUtil.parseObj(HttpUtil.post(requestUrl, new JSONObject()));
}
/**
* 获取access_token 先从Redis获取,如果没有再调微信获取并存Redis
*
* @return
*/
public String getAccessToken() {
String token = redisService.get(RedisConstant.REDIS_KEY_WECHAT_ACCESS_TOKEN);
if (StrUtil.isNotBlank(token)) {
return token;
}
String accessTokenUrl = ACCESS_TOKEN_URL.formatted(APPID, SECRET);
String accessToken = Json.fromJson(NutMap.class, Http.get(accessTokenUrl).getContent()).getString("access_token");
redisService.setex(RedisConstant.REDIS_KEY_WECHAT_ACCESS_TOKEN, 60 * 60 * 2, accessToken);
return accessToken;
}
}
@@ -36,4 +36,9 @@ public class WxPayNeedParamVo {
* 其余参数可忽略
*/
private Payer payer;
/**
* 会员支付信息ID,必填
*/
private String memberPaymentInfoId;
}
@@ -1,6 +1,37 @@
package io.v.nutz.sys.controllers.platform.sys;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.socket.SocketUtil;
import io.v.nutz.base.payment.wxpay.util.WeChatUtils;
import io.v.nutz.base.utils.LoginUtil;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.slog.SLogService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Attr;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
/**
* 微信公众号
@@ -9,5 +40,167 @@ import org.nutz.ioc.loader.annotation.IocBean;
* @date 2023/07/06
*/
@IocBean
@At("/platform/wechat")
public class SysWechatController {
private static String ACCESS_TOKEN_URL = "https://%s/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
private static final String APPID = "wxf12fa6175ec7c75f";
private static final String SECRET = "f65bbb41d3de4a93c8c93d8e2fd50369";
@Inject
private Dao dao;
@Inject
private WeChatUtils weChatUtils;
@Inject
private SysUserService sysUserService;
@Inject
private RedisService redisService;
@Inject
private SLogService sLogService;
@Inject
private LoginUtil loginUtil;
/**
* oauth
*
* @return {@link String}
*/
@At
@Ok("re")
public String oauth(@Param("redirectUrl") String redirectUrl) {
String redirect = Globals.AppDomain + "/platform/wechat/getCode";
if (StrUtil.isNotBlank(redirect)) {
redirect += "?redirect=" + redirect;
}
String codeUrl = weChatUtils.getCodeUrl(redirect, "");
return "redirect:" + codeUrl;
}
/**
* 获取code 登录用户
*
* @param code 代码
* @return {@link String}
*/
@At
@Ok("re")
public String getCode(@Param("code") String code, @Param("redirect") String redirect, HttpSession session, HttpServletRequest request) {
String host;
try {
Socket socket = SocketUtil.connect("api.weixin.qq.com", 443, 1000);
if (socket.isConnected()) {
host = "api.weixin.qq.com";
} else {
InetAddress inetAddress = InetAddress.getLocalHost();
host = inetAddress.getHostAddress();
}
} catch (Exception e) {
host = "api.weixin.qq.com";
}
String tokenUrl = ACCESS_TOKEN_URL.formatted(host, APPID, SECRET, code);
NutMap resMap = Json.fromJson(NutMap.class, HttpUtil.get(tokenUrl));
String openid = resMap.getString("openid");
Sys_user sysUser = dao.fetch(Sys_user.class, Cnd.where("openId", "=", openid));
if (sysUser == null) {
String s = Globals.AppDomain + "/platform/wechat/doLogin?openid=" + openid;
if (StrUtil.isNotBlank(redirect)) {
s += "&redirect=" + URLEncoder.encode(redirect, StandardCharsets.UTF_8);
}
// return ">>:" + Globals.CasAddress + "/login?service=" + URLEncoder.encode(s, StandardCharsets.UTF_8);
return ">>:" + s;
}
String loginName = Optional.ofNullable(sysUser).map(x -> x.getLoginname()).orElse(null);
try {
loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN);
if (StrUtil.isNotBlank(redirect)) {
return ">>:" + redirect;
}
return ">>:" + Globals.AppDomain + "/platform/home";
} catch (LockedAccountException e) {
request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试");
return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError";
} catch (UnknownAccountException e) {
request.setAttribute("errMsg", "系统中没有此用户");
return ">>:" + Globals.AppDomain + "/error/UnknownAccountError.html";
} catch (AuthenticationException e) {
request.setAttribute("errMsg", "系统中没有此用户");
return ">>:" + Globals.AppDomain + "/error/UnknownAccountError.html";
} catch (Exception e) {
request.setAttribute("errMsg", "用户名或密码错误");
return ">>:" + Globals.AppDomain + "/error/500.html";
}
}
@At
@Ok("re")
public Object doLogin(@Attr("platformLoginToken") AuthenticationToken token,
HttpServletRequest request, HttpSession session,
@Param("redirect") String redirect, @Param("openid") String openid) {
// int errCount = NumberUtils.toInt(Strings.sNull(SecurityUtils.getSubject().getSession(true).getAttribute("platformErrCount")));
// try {
// loginUtil.doLogin(token, request, session, LoginUtil.LoginOrigin.WEI_XIN);
//
// return Result.success("login.success");
// } catch (CaptchaIncorrectException e) {
// return Result.error(1, "login.error.captcha");
// } catch (CaptchaEmptyException e) {
// return Result.error(2, "login.error.captcha");
// } catch (LockedAccountException e) {
// return Result.error(3, "login.error.locked");
// } catch (UnknownAccountException e) {
// errCount++;
// SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount);
// return Result.error(4, "login.error.user");
// } catch (AuthenticationException e) {
// errCount++;
// SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount);
// return Result.error(5, "login.error.user");
// } catch (Exception e) {
// errCount++;
// SecurityUtils.getSubject().getSession(true).setAttribute("platformErrCount", errCount);
// return Result.error(6, "login.error.system");
// }
// Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
// if (assertion == null) {
// return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError";
// }
//
// String principal = assertion.getPrincipal().toString();
// //工号 手机号 身份证
// Sys_user user = dao.fetch(Sys_user.class, Cnd.NEW().and("loginname", "=", principal).or("mobile", "=", principal).or("idcard", "=", principal));
// String loginName = Optional.ofNullable(user).map(v -> v.getLoginname()).orElse(null);
//
// try {
// loginUtil.doLogin(loginName, request, session, LoginUtil.LoginOrigin.WEI_XIN);
// //绑定openId
// if (StrUtil.isNotBlank(openid)) {
// dao.update(Sys_user.class, Chain.make("openId", openid), Cnd.where("loginName", "=", loginName));
// }
// if (StrUtil.isNotBlank(redirect)) {
// return ">>:" + redirect;
// }
// return ">>:" + Globals.AppDomain + "/mobile/index";
// } catch (LockedAccountException e) {
// request.setAttribute("errMsg", "帐号被锁定,请5分钟后再试");
// return ">>:" + Globals.AppDomain + "/platform/home/LockedAccountError";
// } catch (UnknownAccountException e) {
// request.setAttribute("errMsg", "系统中没有此用户");
// return ">>:" + Globals.AppDomain + "/platform/home/UnknownAccountError";
// } catch (Exception e) {
// request.setAttribute("errMsg", "用户名或密码错误");
// return ">>:" + Globals.AppDomain + "/platform/home/500";
// }
return null;
}
}
@@ -626,6 +626,11 @@ public class Sys_user extends BaseModel implements Serializable {
@ColDefine(type = ColType.VARCHAR, width = 300)
private String weAppOpenid;
@Column
@Comment("微信openId")
@ColDefine(type = ColType.VARCHAR, width = 300)
private String openId;
/**
* 2021-05-18 end
*/
@@ -0,0 +1,82 @@
package io.v.nutz.zhgh.memberCost.controller;
import io.v.nutz.base.payment.wxpay.service.WxPayCommonService;
import io.v.nutz.base.payment.wxpay.util.WeChatUtils;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Dao;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* @version 1.0
* @Author zzr
* @name:MemberPaymentTestController
* @Date 2025/3/10 14:55
* @注释
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/member/payment/test")
public class MemberPaymentTestController {
@Inject
private Dao dao;
@Inject
private WeChatUtils weChatUtils;
@Inject
private RedisService redisService;
@Inject
private WxPayCommonService wxPayCommonService;
@Inject
private MemberPaymentService memberPaymentService;
@At("")
@Ok("beetl:/platform/membercost/test/index.html")
@RequiresPermissions("member.payment.test")
public void index() {
}
/**
* 微信jsapi支付需要网页授权认证
* @param redirect
* @param userId
* @return
*/
@At
@Ok("re")
public String oauth(String redirect, String userId){
String url = weChatUtils.getCodeUrl("https://schoolhd.top/platform/wxPay/getCode", userId);
redisService.setex("wx_pay_redirect_url", 60 * 60, "https://schoolhd.top/" + redirect);
return "redirect:" + url;
}
/**
* 上面授权后会转到这个地址,然后去改数据库的openId,
* 后续对微信做一个免登录
* @param code
* @param state
* @return
*/
@At
@Ok("re")
public String getCode(@Param("code") String code, @Param("state") String state){
String openId = wxPayCommonService.getOpenId(code);
// WxPayNeedParamVo paramVo = new WxPayNeedParamVo();
// paramVo.setDescription("支付");
// paramVo.setAttach("");
// paramVo.setAmount(new Amount().setTotal(1));
// paramVo.setPayer(new Payer().setOpenid(openId));
// Result result = wxPayCommonService.jsApiPay(paramVo);
return null;
// return "redirect:" + redisService.get("wx_pay_redirect_url");
}
}
@@ -0,0 +1,48 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<!-- 微信唤起jsapi支付的HTML方法 -->
</div>
<script src="https://res2.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
<script>
function onBridgeReady(json) {
// const data = JSON.parse(json)
WeixinJSBridge.invoke("getBrandWCPayRequest", JSON.parse(json), function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
})
}
new Vue({
el: "#app",
data() {
return {}
},
methods: {
async initData() {
const resp = await $.post("/platform/member/payment/test/getCode")
debugger
if (resp.code === 0) {
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", onBridgeReady(resp.data))
} else if (document.attachEvent) {
document.attachEvent("WeixinJSBridgeReady", onBridgeReady(resp.data))
document.attachEvent("onWeixinJSBridgeReady", onBridgeReady(resp.data))
}
} else {
onBridgeReady(resp.data)
}
}
}
},
created() {
// this.initData()
}
})
</script>
<!--#
}
#-->