Commit 553d6227 by tang

垃圾通道来回修改,推广方式更改

parent 00b763b3
......@@ -51,6 +51,7 @@ public static final String QUICK_WEB_PAY = "/quick/web/pay";
public static final String NO_INTEGRAL_QUICK_PAY_URL = "/quick/pay"; // 无积分快捷支付
public static final String NO_INTEGRAL_ORDER_QUERY_URL = "/order/query"; // 查询订单
public static final String NOTIFY_CALLBACK_URL = "http://youkapay.com/youka-api/api/pay/notifyQuickPay";
public static final String NO_INTEGRAL_QUICK_WAP_PAY_URL = "/quick/pay/v2"; // 无积分快捷支付
public static final String EXTRA_RATE = "200"; // 附加手续费(单位:分)
......@@ -114,6 +115,7 @@ public static final String QUICK_WEB_PAY = "/quick/web/pay";
public static final long hours = 24;
public static final SimpleDateFormat YYYYMMDD_HHMMSS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//HH:mm:ss 24小时制
public static final SimpleDateFormat YYYYMMDDHHMM = new SimpleDateFormat("yyyyMMddhhmm");
public static final SimpleDateFormat HHMMSS = new SimpleDateFormat("HH:mm:ss");
/**
* 系统公共
*/
......@@ -167,6 +169,8 @@ public static final String QUICK_WEB_PAY = "/quick/web/pay";
*/
public static final String STATUS_CODE_6001 = "6001";
public static final String STATUS_CODE_6001_DESC = "订单号不存在";
public static final String STATUS_CODE_6002 = "6002";
public static final String STATUS_CODE_6002_DESC = "交易时间为09:00:00-22:00:00";
/**
......
......@@ -8,6 +8,7 @@ import com.thinkgem.jeesite.modules.commonError.MyException;
import com.thinkgem.jeesite.modules.pay.entity.BalanceEntity;
import com.thinkgem.jeesite.modules.pay.entity.OrderEntity;
import com.thinkgem.jeesite.modules.pay.juhezhong.dto.PayBackDto;
import com.thinkgem.jeesite.modules.pay.juhezhong.utils.DateUtil;
import com.thinkgem.jeesite.modules.pay.service.PayApiService;
import com.thinkgem.jeesite.modules.sys.entity.Dict;
import com.thinkgem.jeesite.modules.sys.entity.DictPayChannel;
......@@ -63,11 +64,15 @@ public class PayApiController {
public Response quickPay(JuHeZhongPayRequest request) {
Response resp = new Response();
try {
//非交易时间直接返回
if (!DateUtil.checkTimeIsDuration()) {
throw new MyException(ComCode.STATUS_CODE_6002_DESC);
}
PayBackDto payBackDto = payService.quickPay(request);
if ((payBackDto.getUrl() != null && !"".equals(payBackDto.getUrl())) || "0".equals(payBackDto.getIsUrl())) {
resp.setStatus(ComCode.STATUS_CODE_2000);
resp.setMessage(ComCode.STATUS_CODE_2000_DESC);
logger.debug("快捷支付返回URL: {}", payBackDto.getUrl());
resp.setData(payBackDto);
} else {
resp.setStatus(ComCode.STATUS_CODE_9998);
......@@ -388,7 +393,7 @@ public class PayApiController {
String orderId = request.getParameter("dsorderid");
String code = request.getParameter("respCode");
if ("00".equals(code)) {
logger.debug("orderId: {}",orderId);
logger.debug("orderId: {}", orderId);
OrderEntity orderEntity = new OrderEntity();
orderEntity.setPayCode(orderId);
......@@ -577,7 +582,7 @@ public class PayApiController {
value[0] = ov.toString();
}
for (int k = 0; k < value.length; k++) {
logger.debug("参数名: {} , 参数值: {}",ok,value[k]);
logger.debug("参数名: {} , 参数值: {}", ok, value[k]);
}
}
}
......
......@@ -109,6 +109,20 @@ private Long timestamp;
*/
private String productName;
/**
* 手续费率 例:0.005 千5
* webPay 必传
*/
private String userRate;
public String getUserRate(){
return userRate;
}
public void setUserRate(String userRate){
this.userRate = userRate;
}
public String getUserId ( ) {
return userId;
}
......
......@@ -142,6 +142,13 @@ public JSONObject quickWebPay ( JuhezhongDto dto ) throws Exception {
String respStr = HttpUtil.post(ComCode.HOST + ComCode.NO_INTEGRAL_QUICK_PAY_URL, params);
return JSONObject.parseObject(respStr);
}
/**
* 快捷B支付接口(老)6-29停用
* @param dto
* @return
* @throws Exception
*/
public JSONObject quickPay(JuhezhongDto dto) throws Exception {
Map<String, Object> params = Bean2Map.Entity2Map(dto);
String signBefore = SignUtils.signBefore(params);
......@@ -151,6 +158,21 @@ public JSONObject quickWebPay ( JuhezhongDto dto ) throws Exception {
return JSONObject.parseObject(respStr);
}
/**
* 积分快捷(wap)6-29 新接口,需要返回url,异步消息并不能代表成功,只能设置订单状态为支付中
* @param dto
* @return
* @throws Exception
*/
public JSONObject quickPayWap(JuhezhongDto dto) throws Exception {
Map<String, Object> params = Bean2Map.Entity2Map(dto);
String signBefore = SignUtils.signBefore(params);
String sign = SignUtils.sign(signBefore, ComCode.MERCHANT_SECRET);
params.put("sign", sign);
String respStr = HttpUtil.post(ComCode.HOST + ComCode.NO_INTEGRAL_QUICK_WAP_PAY_URL, params);
return JSONObject.parseObject(respStr);
}
public JSONObject quickPay(JSONObject dto)throws Exception{
String signBefore = SignUtils.signBefore(dto);
System.out.println(signBefore);
......@@ -161,6 +183,16 @@ public JSONObject quickWebPay ( JuhezhongDto dto ) throws Exception {
return JSONObject.parseObject(respStr);
}
public JSONObject quickPayWap(JSONObject dto)throws Exception{
String signBefore = SignUtils.signBefore(dto);
System.out.println(signBefore);
String sign = SignUtils.sign(signBefore, ComCode.MERCHANT_SECRET);
System.out.println("sign:"+sign);
dto.put("sign", sign);
String respStr = HttpUtil.post(ComCode.HOST + ComCode.NO_INTEGRAL_QUICK_WAP_PAY_URL, dto);
return JSONObject.parseObject(respStr);
}
/**
* 查询订单状态
*
......
package com.thinkgem.jeesite.modules.pay.juhezhong.utils;
import com.thinkgem.jeesite.common.constant.ComCode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* @author lsw
* @date 2016年1月3日
* @version 1.0
* @date 2016年1月3日
* @desc 日期工具类
*/
public class DateUtil {
/**
* 将时间格式化成指定的字符串
*
* @param date
* @param ftm
* @return
*/
public static String format2str(Date date, String ftm) {
return new SimpleDateFormat(ftm).format(date);
}
/**
* 装字符串格式化成指定日期时间
* @param value
* @param fmt
/**
* 将时间格式化成指定的字符串
*
* @param date
* @param ftm
* @return
*/
public static String format2str(Date date, String ftm) {
return new SimpleDateFormat(ftm).format(date);
}
/**
* 装字符串格式化成指定日期时间
*
* @param value
* @param fmt
* @return
*/
public static Date string2Date(String value,String fmt){
try {
return new SimpleDateFormat(fmt).parse(value);
} catch (ParseException e) {
}
return new Date();
}
public static Date string2Date(String value, String fmt) {
try {
return new SimpleDateFormat(fmt).parse(value);
} catch (ParseException e) {
}
return new Date();
}
/**
* 检验当前时间是否在一个区间范围内
* @return
*/
public static boolean checkTimeIsDuration() {
Boolean flag = false;
String now = ComCode.HHMMSS.format(new Date());
Date time;
try {
time = ComCode.HHMMSS.parse(now);
Date start = ComCode.HHMMSS.parse("09:00:00");
Date end = ComCode.HHMMSS.parse("22:00:00");
if (isInTimeDuration(time, start, end)) {
flag = true;
}
} catch (ParseException e) {
e.printStackTrace();
}
return flag;
}
/**
* 判断当前时间是否在[startTime, endTime]区间
*
* @param nowTime 当前时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
public static boolean isInTimeDuration(Date nowTime, Date startTime, Date endTime) {
//首先判断是否与收尾时间相同,相同直接返回
if (nowTime.getTime() == startTime.getTime()
|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
}
\ No newline at end of file
......@@ -44,6 +44,8 @@ import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;
import static com.thinkgem.jeesite.modules.user.service.UserApiService.getCardDetailByAli;
/**
* 支付相关
*/
......@@ -104,6 +106,9 @@ public class PayApiService {
payBackDto.setIsUrl("0");
return payBackDto;
}
if(Integer.valueOf(request.getAmount()) > 20000){
throw new MyException("超出单笔最大限额");
}
// 1. 根据入参获取用户详情信息,包括支付卡片信息
UserEntity userEntity = userService.getUserInfo(new Request(request.getSubMerchantCode()));
userEntity = userService.getUserDetailInfo(userEntity);
......@@ -126,7 +131,7 @@ public class PayApiService {
// 4. JuHeZhong支付
PayBackDto payBackDto = new PayBackDto();
if (ComCode.PAYCHANNEL_HL1.equals(request.getPayChannel())) {
OrderEntity orderEntity = new OrderEntity(code, request.getSubMerchantCode(), payNo, payCode, "quick", request.getPayChannel(), "1", amount, request.getSubject(), "", String.valueOf("D".equalsIgnoreCase(userEntity.getUserDetail().getCard().getCardType()) ? 5 : ("C".equalsIgnoreCase(userEntity.getUserDetail().getCard().getCardType()) ? 6 : 0)), request.getCardCode());
OrderEntity orderEntity = new OrderEntity(code, request.getSubMerchantCode(), payNo, payCode, "quick", request.getPayChannel(), "0", amount, request.getSubject(), "", String.valueOf("D".equalsIgnoreCase(userEntity.getUserDetail().getCard().getCardType()) ? 5 : ("C".equalsIgnoreCase(userEntity.getUserDetail().getCard().getCardType()) ? 6 : 0)), request.getCardCode());
addUserBenefits(userEntity, orderEntity, code, request);
// payDao.saveOrderInfo(orderEntity);
// // 3. 创建分润信息,并保存
......@@ -853,26 +858,37 @@ public class PayApiService {
//获取扣除手续费后的金额,已经转换为分
// BigDecimal amount = calculationAmount(gradeRate, request.getAmount());
// int amountFen = amount.multiply(BigDecimal.valueOf(100.0)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue();
int amount = calculationAmount(gradeRate, request.getAmount());
//6-29接口方更改了接口,传费率
// int amount = calculationAmount(gradeRate, request.getAmount());
//通过用户code获取user_detail表中数据
UserDetailEntity userDetail = userService.getUserDetailByCode(userEntity.getCode());
PayBackDto payBackDto = new PayBackDto();
payBackDto.setIsUrl("0");
//获取结算卡信息
CardEntity cardEntityDebit = userService.getCardInfoByCode(userEntity);
//借记卡不支持的银行 花旗银行,北京银行
if(cardEntityDebit.getBankName().equals("北京银行")){
throw new MyException("结算暂不支持该银行卡片");
}
//贷记卡不支持银行 农业银行,中信银行,招商银行
if(checkCardIsCanUse(cardEntity.getCardNo())){
throw new MyException("贷记卡暂不支持该银行");
}
JuhezhongDto dto = new JuhezhongDto();
dto.setOrderId(orderEntity.getPayCode());//非订单号,回调根据此值进行修改
dto.setMerchantId(ComCode.MERCHANT_ID);//商户号
dto.setMerchantKey(ComCode.MERCHANT_KEY);
dto.setAmount(Integer.valueOf(request.getAmount()) * 100);//订单金额,单位为分
dto.setTrxType(3);//交易类型,默认传3
dto.setType(cardEntity.getCardType().equals("D") ? 6 : 5);//5 借记卡 只能 D0 6 贷记卡 D0 t1 ,表中 银行卡类型 D储蓄卡 C信用卡'
//注释参数,因接口提供方更改接口停用接口
// dto.setType(cardEntity.getCardType().equals("D") ? 6 : 5);//5 借记卡 只能 D0 6 贷记卡 D0 t1 ,表中 银行卡类型 D储蓄卡 C信用卡'
dto.setBankNo(cardEntity.getCardNo());//支付卡号
dto.setCvn2(cardEntity.getCvn2());//安全码
// dto.setCvn2(cardEntity.getCvn2());//安全码
dto.setPhone(cardEntity.getCardMobile());//支付卡预留手机号
dto.setExpired(cardEntity.getExpireDate());//信用卡有效期(MMYY)
dto.setUserFee(amount < 200 ? Integer.valueOf(ComCode.EXTRA_RATE) : amount);//手续费 单位:分 ,D0 业务必传,商家约定
// dto.setExpired(cardEntity.getExpireDate());//信用卡有效期(MMYY)
// 增加参数,手续费率 例:0.005 千5
dto.setUserRate(gradeRate.getRate());
dto.setUserFee((Integer.valueOf(gradeRate.getSiglePrice()) - 1) * 100);//手续费 单位:分 ,D0 业务必传,商家约定
if (cardEntity.getCardType().equals("C")) {
if (cardEntityDebit == null) {
throw new MyException("还没有结算卡!");
......@@ -888,16 +904,20 @@ public class PayApiService {
dto.setTimestamp(System.currentTimeMillis());
logger.debug("HL4支付请求参数, expireDate: {}, cvn2: {}, cardMobile: {}, " +
"cardNo: {}, settleBankName: {}, settleBankNo: {}, settleBankPhone:{}, " +
"name:{}, certificateCode:{}, userFee:{}", request.getExpireDate(), request.getCvn2(),
"name:{}, certificateCode:{}, userFee:{}, userRate:{}", request.getExpireDate(), request.getCvn2(),
cardEntity.getCardMobile(), cardEntity.getCardNo(), cardEntityDebit.getBankName(), cardEntityDebit.getCardNo(),
cardEntityDebit.getCardMobile(), userDetail.getRealName(), userDetail.getIdCard(), amount);
cardEntityDebit.getCardMobile(), userDetail.getRealName(), userDetail.getIdCard(), (Integer.valueOf(gradeRate.getSiglePrice()) - 1) * 100, gradeRate.getRate());
JSONObject jsonObject = juHeZhongPayService.quickPay(dto);
// 因6-29停用老接口,故更改
JSONObject jsonObject = juHeZhongPayService.quickPayWap(dto);
logger.debug("HL4支付返回结果信息:{}" + jsonObject.toJSONString());
payBackDto.setMessage(jsonObject.getString("msg"));
if ("0000".equals(jsonObject.get("code"))) {
//订单支付成功,则进行一次查询,修改订单状态
// this.notifyPay(orderEntity);
logger.debug("HL4支付完成获取到的url: {}", jsonObject.getString("url"));
payBackDto.setIsUrl("1");
payBackDto.setUrl(jsonObject.getString("url"));
return payBackDto;
} else {
throw new MyException(jsonObject.getString("msg"));
......@@ -1144,9 +1164,10 @@ public class PayApiService {
// logger.debug("查询订单返回结果: {}" + jsonObject.toJSONString());
// 支付成功
//订单已经支付成功,则不进行再次修改,可能存在多次回调,所以进行判断
if (!orderEntity.getPayStatus().equals("2")) {
if (orderEntity.getPayStatus().equals("0")) {
logger.debug("进入修改订单状态");
orderEntity.setPayStatus("2");
//改为支付中
orderEntity.setPayStatus("1");
payDao.updateOrderStatus(orderEntity);
}
orderEntity = payDao.getOrder(orderEntity);
......@@ -1237,7 +1258,7 @@ public class PayApiService {
*/
@Transactional(readOnly = false)
public void updateOrderTiming() {
// System.out.println("。。。。。。。定时任务。updateOrderTiming开始。。。。");
logger.debug("修改交易超过7天订单的定时任务开始");
OrderEntity orderEntity = new OrderEntity();
orderEntity.setEndTime(DateUtils.getDateByDay("yyyy-MM-dd HH:mm:ss", -7));
List<OrderEntity> list = payDao.getOrderListTimeing(orderEntity);
......@@ -1248,7 +1269,7 @@ public class PayApiService {
benefitEntity.setOrderCode(order.getPayCode());
payDao.deleteBenefit(benefitEntity);
}
// System.out.println("。。。。。。。定时任务。updateOrderTiming结束。。。。");
logger.debug("修改交易超过7天订单的定时任务开始");
}
/*
......@@ -1256,7 +1277,7 @@ public class PayApiService {
*/
@Transactional(readOnly = false)
public void updateOrders() {
// System.out.println("。。。。。。。定时任务。updateOrders开始。。。。");
logger.debug("定时任务修改订单状态");
try {
OrderEntity orderEntity = new OrderEntity();
orderEntity.setStartTime(DateUtils.getDateByDay("yyyy-MM-dd HH:mm:ss", -7));
......@@ -1277,18 +1298,15 @@ public class PayApiService {
jsonObject = juHeZhongPayIntegralService.query(dto);
} else if (ComCode.PAYCHANNEL_HL1.equals(order.getPayChannel())) {
jsonObject = juHeZhongPayService.query(dto);
} else if (ComCode.PAYCHANNEL_HL2.equals(orderEntity.getPayChannel())) {
dto.setMerchantId(ComCode.JFEN_MERCHANT_ID);
dto.setMerchantKey(ComCode.JFEN_MERCHANT_KEY);
jsonObject = juHeZhongPayJFenService.query(dto);
}
if (jsonObject != null) {
// System.out.println("查询订单返回结果:"+jsonObject.toJSONString());
// 支付成功
if ("0000".equals(jsonObject.get("code"))) {
System.out.println("定时任务查询订单返回结果:" + jsonObject.toJSONString());
logger.debug("1小时的定时任务查询订单返回结果: {}", jsonObject.toJSONString());
order.setPayStatus("2");
payDao.updateOrderStatus(order);
} else { // 支付失败
......@@ -1326,6 +1344,47 @@ public class PayApiService {
}
/*
* 查询交易的状态并修改
*/
@Transactional(readOnly = false)
public void updateOrdersHL4() {
logger.debug("HL4专用定时任务修改订单状态");
try {
OrderEntity orderEntity = new OrderEntity();
orderEntity.setPayChannel("quick_no_integral");
//返回url有几分钟过期时间,url中订单处理需要验证码等时间,暂定查询20分钟之内的订单
orderEntity.setStartTime(DateUtils.formatDate(DateUtils.addMinutes(new Date(), -20), "yyyy-MM-dd HH:mm:ss"));
orderEntity.setEndTime(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
List<OrderEntity> list = payDao.getOrderListTimeing(orderEntity);
for (OrderEntity order : list) {
// 快捷支付
if ("quick".equals(order.getPayMethod())) {
QuickDto dto = new QuickDto();
dto.setOrderId(order.getPayCode());
dto.setTimestamp(System.currentTimeMillis());
JSONObject jsonObject = null;
if (ComCode.PAYCHANNEL_HL1.equals(order.getPayChannel())) {
jsonObject = juHeZhongPayService.query(dto);
}
if (jsonObject != null) {
// 支付成功
logger.debug("HL4定时查询订单返回结果: {}", jsonObject.toJSONString());
if ("0000".equals(jsonObject.get("code"))) {
order.setPayStatus("2");
payDao.updateOrderStatus(order);
} else { // 支付失败
orderFail(order);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public JSONObject queryForward(String payCode) throws Exception {
// 查询单笔转账
......@@ -1482,4 +1541,18 @@ public class PayApiService {
int result = BigDecimal.valueOf(siglePrice * 100).intValue();
return result;
}
//获取银行卡银行,是否可用
private boolean checkCardIsCanUse(String cardNum){
boolean flag = true;
String cardDetail = getCardDetailByAli(cardNum);
JSONObject parse = (JSONObject) JSONObject.parse(cardDetail);
if(parse.get("validated").equals(true)){
if (parse.get("bank").equals("ABC")||parse.get("bank").equals("CMB")||parse.get("bank").equals("CITIC") ){
return false;
}
}
return flag;
}
}
......@@ -24,6 +24,11 @@ public class TimingService {
payApiService.updateOrders();
}
@Scheduled(cron = "20 0/2 * * * ? ")
public void updateOrdersHL4(){
payApiService.updateOrdersHL4();
}
@Scheduled(cron = "0 0/5 * * * ? ")
public void updateUserGrade(){
userApiService.updateUserLevel();
......
......@@ -114,6 +114,9 @@
card_code
FROM youka_orders
WHERE pay_status = 1
<if test="payChannel != null and payChannel != ''">
AND pay_channel = #{payChannel}
</if>
<if test="endTime != null and endTime != ''">
AND create_date &lt;= #{endTime}
</if>
......
......@@ -59,7 +59,7 @@ function validPhone(ele){
if(validCode){
validCode = false;
$.ajax({
url: 'http://youkapay.com:8080/youka-api/api/user/getIdentifyCode',
url: 'http://youkapay.com/youka-api/api/user/getIdentifyCode',
data: content,
dataType: 'json',
type: 'POST',
......@@ -131,25 +131,26 @@ $("#submit").on("click",function(){
console.info(content)
$.ajax({
type: 'POST',
url: 'http://youkapay.com:8080/youka-api/api/user/signUp',
url: 'http://youkapay.com/youka-api/api/user/signUp',
data: content,
dataType: 'json',
success:function(data){
console.info(data)
if(data.status == '2000'){
//跳转到市场
// window.location = "apk下载地址";
var user = navigator.userAgent;
if (user.match(/(iphone os)/i)) {
console.log("isphone");
window.location.href = 'https://www.pgyer.com/7aJ3'
// window.location.href='https://appsto.re/cn/KG6P2.i'
}else if(user.match(/ipad/i)){
console.log("isipad");
}else if(user.match(/(midp|ucweb|android|windows ce|windows mobile)/i)){
console.log("android");
// window.location.href='http://tstatics.iyuwan.com/files/apk/201605/Iyuwan.apk'
};
// window.location = "apk下载地址";
window.location.href="http://youkapay.com/youka-api/static/share/spread.html";
// var user = navigator.userAgent;
// if (user.match(/(iphone os)/i)) {
// console.log("isphone");
// window.location.href = 'https://www.pgyer.com/7aJ3'
// // window.location.href='https://appsto.re/cn/KG6P2.i'
// }else if(user.match(/ipad/i)){
// console.log("isipad");
// }else if(user.match(/(midp|ucweb|android|windows ce|windows mobile)/i)){
// console.log("android");
// // window.location.href='http://tstatics.iyuwan.com/files/apk/201605/Iyuwan.apk'
// };
}else{
$("#registError").removeClass("none");
$("#registFail").html(data.message);
......
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width">
<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="js/getQueryStringByName.js"></script>
<!--
<script type="text/javascript" src="js/sha1.js"></script>
<script type="text/javascript" src="js/DES.js"></script>
-->
<script type="text/javascript" src="js/md5.js"></script>
<script type="text/javascript" src="js/base64.js"></script>
<link rel="stylesheet" href="css/style.css">
<title>优卡生活</title>
<style>
button{
background: none;
outline: none;
border: none;
color: #FFFFFF;
display: block;
width: 50%;
height: 0;
padding: 10%;
line-height: 0px;
border-radius: 20px;
font-size: 25px;
}
#ios{
background:#FFBB2C;
}
#android{
background:#33FF33;
}
.containter{
position:absolute;
width:100%;
top:20%;
left:50%;
transform:translate(-50%);
}
</style>
</head>
<body>
<div align="center" class="containter">
<button onclick="window.open('https://www.pgyer.com/7aJ3')" id="ios">IOS 下载</button>
<br>
<button onclick="window.open('https://www.pgyer.com/7aJ3')" id="android">安卓下载</button>
</div>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment