浏览代码

支付app调整

wangkaiyue 5 年之前
父节点
当前提交
8bfb6bfa20
共有 29 个文件被更改,包括 2255 次插入213 次删除
  1. 42 0
      src/jfw/modules/app/src/app/front/commonPay.go
  2. 1 1
      src/jfw/modules/app/src/app/front/ws_dataExport.go
  3. 185 0
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/base.css
  4. 266 0
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/paySuccess.css
  5. 746 0
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/public.css
  6. 4 0
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/weui.min.css
  7. 3 0
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.css
  8. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.eot
  9. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.ttf
  10. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.woff
  11. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.woff2
  12. 393 0
      src/jfw/modules/app/src/web/staticres/jyapp/commonPay/js/common.js
  13. 4 1
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_index_new.js
  14. 1 1
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_order_detail.js
  15. 7 10
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_renew.js
  16. 295 0
      src/jfw/modules/app/src/web/templates/commonPay/checkout.html
  17. 100 0
      src/jfw/modules/app/src/web/templates/commonPay/paySuccess.html
  18. 12 16
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_payOrder.html
  19. 18 11
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_paySuccess.html
  20. 3 3
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_toOrderDetail.html
  21. 5 43
      src/jfw/modules/app/src/web/templates/vipsubscribe/vip_purchase.html
  22. 2 14
      src/jfw/modules/subscribepay/src/entity/dataReportStruct.go
  23. 2 14
      src/jfw/modules/subscribepay/src/entity/jyCourseOnlineStruct.go
  24. 54 0
      src/jfw/modules/subscribepay/src/pay/util.go
  25. 108 78
      src/jfw/modules/subscribepay/src/service/commonAction.go
  26. 0 18
      src/jfw/modules/subscribepay/src/service/vipSubscribePay.go
  27. 2 1
      src/web/templates/weixin/commonPay/checkout.html
  28. 1 1
      src/web/templates/weixin/commonPay/paySuccess.html
  29. 1 1
      src/web/templates/weixin/dataExport/dataExport_toMyOrder.html

+ 42 - 0
src/jfw/modules/app/src/app/front/commonPay.go

@@ -0,0 +1,42 @@
+package front
+
+import (
+	"errors"
+	"github.com/go-xweb/xweb"
+)
+
+/*
+微信公众号支付公共页面
+*/
+type AppPayCommon struct {
+	*xweb.Action
+	toCreateOrderPage xweb.Mapper `xweb:"/jyapp/pay/checkout_(.*)"` //微信数据导出-支付页面
+	paySuccess        xweb.Mapper `xweb:"/jyapp/(\\w+)/paySuccess"` //微信支付-支付完成
+}
+
+func init() {
+	xweb.AddAction(&AppPayCommon{})
+}
+
+func (w *AppPayCommon) ToCreateOrderPage(doType string) error {
+	orderCode := w.GetString("orderCode")
+	if orderCode == "" || doType == "" {
+		return errors.New("未知订单")
+	}
+	w.T["doType"] = doType
+	w.T["orderCode"] = orderCode
+	return w.Render("/commonPay/checkout.html", &w.T)
+}
+
+func (w *AppPayCommon) PaySuccess(doType string) error {
+	//获取参数
+	w.T["orderCode"] = w.GetString("orderCode")
+	w.T["payTime"] = w.GetString("payTime")
+	w.T["email"] = w.GetString("email")
+	w.T["pay_way"] = w.GetString("pay_way")
+	if doType == "dataexport" {
+		return w.Render("/dataExport/dataExport_paySuccess.html", &w.T)
+	}
+	w.T["doType"] = doType
+	return w.Render("/commonPay/paySuccess.html", &w.T)
+}

+ 1 - 1
src/jfw/modules/app/src/app/front/ws_dataExport.go

@@ -22,7 +22,7 @@ import (
 type WsDataExport struct {
 	*xweb.Action
 	searchExport      xweb.Mapper `xweb:"/jyapp/front/dataExport/searchExport"`      //app数据导出
-	paySuccessPage    xweb.Mapper `xweb:"/jyapp/front/dataExport/paySuccessPage"`    //app数据导出-支付成功页面
+	//paySuccessPage    xweb.Mapper `xweb:"/jyapp/front/dataExport/paySuccessPage"`    //app数据导出-支付成功页面
 	toCreateOrderPage xweb.Mapper `xweb:"/jyapp/front/dataExport/toCreateOrderPage"` //app数据导出-订单支付
 	sendMailVerify    xweb.Mapper `xweb:"/jyapp/front/dataExport/sendMailVerify"`    //发送邮箱验证码
 	checkMailVerify   xweb.Mapper `xweb:"/jyapp/front/dataExport/checkMailVerify"`   //验证邮箱验证码

+ 185 - 0
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/base.css

@@ -0,0 +1,185 @@
+* {
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-overflow-scrolling: touch;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  -webkit-tap-highlight-color: transparent;
+}
+body,
+div,
+dl,
+dt,
+dd,
+ul,
+ol,
+li,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+pre,
+code,
+form,
+fieldset,
+legend,
+input,
+textarea,
+p,
+blockquote,
+th,
+td,
+hr,
+button,
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+sumary {
+  margin: 0;
+  padding: 0;
+}
+html,
+body {
+  /* max-width: 750px; */
+  -webkit-text-size-adjust: 100%;
+  margin: 0 auto;
+  height: 100%;
+  overflow-x: hidden;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.24rem;
+  background: rgba(245, 244, 249, 1);
+  color: #3d3d3d;
+  font-family: "Microsoft YaHei", "Helvetica Neue", "Roboto", "Segoe UI",
+    "PingFang SC", "Hiragino Sans GB", sans-serif;
+}
+
+ul,
+ol {
+  list-style: none;
+}
+/*清除输入框内阴影*/
+input,
+textarea,
+select,
+button {
+  outline: none;
+  border: 0;
+  -webkit-appearance: none;
+  appearance: none;
+}
+button,
+span,
+div {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  /* -webkit-user-modify:read-only; */
+}
+img {
+  border: 0;
+  vertical-align: middle;
+  max-width: 100%;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+a {
+  text-decoration: none;
+  color: #3d3d3d;
+  -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
+  -webkit-user-select: none;
+  -moz-user-focus: none;
+  -moz-user-select: none;
+}
+/*禁用长按页面时的弹出菜单(iOS下有效) ,img和a标签都要加*/
+img,
+a {
+  -webkit-touch-callout: none;
+}
+em,
+i {
+  font-style: normal;
+}
+
+/*兼容ios调取h5页面的头部*/
+.ios-head {
+  display: none;
+  position: fixed;
+  top: 0;
+  padding-top: 15px;
+  background: #18974b;
+  width: 100%;
+  z-index: 100;
+}
+/*base*/
+.clearfix {
+  zoom: 1;
+}
+.clearfix:after {
+  clear: both;
+  height: 0;
+  overflow: hidden;
+  display: block;
+  visibility: hidden;
+  content: "";
+}
+
+.left {
+  float: left;
+}
+
+.right {
+  float: right;
+}
+.ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  text-align: justify
+}
+
+/* 超过2行省略号显示 */
+.ellipsis-2 {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+    text-align: justify
+}
+
+/* 超过3行省略号显示 */
+.ellipsis-3 {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 3;
+    -webkit-box-orient: vertical;
+}
+
+.show {
+  display: block;
+}
+.hide {
+  display: none;
+}
+@media (min-width: 320px){html{font-size: 42.6667px;} }
+@media (min-width: 360px){html{font-size: 48px;} }
+@media (min-width: 375px){html{font-size: 50px;} }
+@media (min-width: 384px){html{font-size: 51.2px;} }
+@media (min-width: 414px){html{font-size: 55.2px;} }
+@media (min-width: 448px){html{font-size: 59.7333px;} }
+@media (min-width: 480px){html{font-size: 48px;} }
+@media (min-width: 512px){html{font-size: 68.2667px;} }
+@media (min-width: 544px){html{font-size: 72.5333px;} }
+@media (min-width: 576px){html{font-size: 76.8px;} }
+@media (min-width: 608px){html{font-size: 81.0667px;} }
+@media (min-width: 640px){html{font-size: 85.3333px;} }
+@media (min-width: 750px){html{font-size: 100px;} }

+ 266 - 0
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/paySuccess.css

@@ -0,0 +1,266 @@
+@charset "UTF-8";
+.main {
+  width: 100%;
+  overflow: scroll;
+}
+
+.main::-webkit-scrollbar {
+  display: none;
+}
+
+.layout_top-bottom {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  height: 100%;
+}
+
+.layout_top-bottom .layou_top {
+  flex: 1;
+  overflow: scroll;
+}
+
+.bottom_button {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  height: .94rem;
+  position: fixed;
+  bottom: 0;
+}
+
+.bottom_button .left_btn,
+.bottom_button .right_btn {
+  flex: 1;
+  height: 100%;
+  font-size: .34rem;
+}
+
+.bottom_button .left_btn {
+  color: #2cb7ca;
+  background-color: #fff;
+  border-top: 1px solid #e0e0e0;
+}
+
+.bottom_button .right_btn {
+  color: #fff;
+  background-color: #2cb7ca;
+  border-top: 1px solid #2cb7ca;
+}
+
+.bottom_button button[disabled] {
+  opacity: .5;
+}
+
+.jy_icon {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+
+.jy_icon.decrease:before,
+.jy_icon.increase:before,
+.jy_icon.increase:after {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  content: '';
+  width: 0.4rem;
+  height: 0.04rem;
+  background-color: #686868;
+  transform: translate(-50%, -50%);
+}
+
+.jy_icon.increase:after {
+  transform: translate(-50%, -50%) rotate(90deg);
+}
+
+/*禁止长按复制 加给body*/
+.no-touch {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+/* 弹性盒子布局 */
+.flex_alginC {
+  display: flex;
+  align-items: center;
+}
+
+.flex_alginC_justB {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.flex_alginC_justC {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.flex_column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex_column_alignC {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+/* 自定义弹窗*/
+.custom-dialog .weui-dialog__hd {
+  background: #F5F4F9;
+  padding: .17rem 0;
+  color: #000;
+  font-size: .34rem;
+  text-align: center;
+}
+
+.custom-dialog .weui-dialog__bd {
+  padding: .37rem 0;
+  color: #1D1D1D;
+  font-size: .32rem;
+  text-align: center;
+}
+
+.custom-dialog .weui-dialog__ft:after {
+  border: 0;
+}
+
+.custom-dialog .weui-dialog__btn:after {
+  border: 0;
+}
+
+.custom-dialog .weui-dialog__ft {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding-bottom: .38rem;
+  box-sizing: border-box;
+  text-align: center;
+}
+
+.custom-dialog .weui-dialog__btn {
+  display: block;
+  width: 1.72rem;
+  height: .72rem;
+  line-height: .72rem;
+  color: #fff;
+  padding: 0;
+  flex: none;
+  text-align: center;
+  border-radius: 3px;
+}
+
+.custom-dialog .weui-dialog__btn_primary {
+  background-color: #2CB7CA;
+  margin-right: 1rem;
+}
+
+.custom-dialog .weui-dialog__btn_default {
+  background-color: #BFBFC3;
+}
+
+/* 自定义switch按钮 */
+.custom-switch {
+  position: relative;
+  width: 52px;
+  height: 32px;
+  border: 1px solid #dfdfdf;
+  outline: 0;
+  border-radius: 16px;
+  box-sizing: border-box;
+  background-color: #dfdfdf;
+  -webkit-transition: background-color .1s,border .1s;
+  transition: background-color .1s,border .1s;
+  -webkit-appearance: none;
+}
+
+.custom-switch:before {
+  content: " ";
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 50px;
+  height: 30px;
+  border-radius: 15px;
+  background-color: #fdfdfd;
+  -webkit-transition: -webkit-transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+  transition: -webkit-transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+  transition: transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+  transition: transform 0.35s cubic-bezier(0.45, 1, 0.4, 1), -webkit-transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+}
+
+.custom-switch:after {
+  content: " ";
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 30px;
+  height: 30px;
+  border-radius: 15px;
+  background-color: #fff;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
+  -webkit-transition: -webkit-transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+  transition: -webkit-transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+  transition: transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+  transition: transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35), -webkit-transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+}
+
+.custom-switch.checked {
+  border-color: #04be02;
+  background-color: #04be02;
+}
+
+.custom-switch.checked:before {
+  transform: scale(0);
+}
+
+.custom-switch.checked:after {
+  transform: translateX(20px);
+}
+
+.layou_top .icon_box {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  height: 4rem;
+  color: #2cb7ca;
+}
+
+.layou_top .icon_box i.icon {
+  font-size: 1.6rem;
+}
+
+.layou_top .icon_box p {
+  font-size: .48rem;
+}
+
+.layou_top .info_box {
+  padding: 0 .4rem;
+  border-top: 1px solid #e0e0e0;
+  border-bottom: 1px solid #e0e0e0;
+}
+
+.layou_top .info_box > div {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  height: .88rem;
+  color: #666;
+  font-size: .28rem;
+  border-bottom: 1px solid #e0e0e0;
+}
+
+.layou_top .info_box > div:last-of-type {
+  border-bottom: 0;
+}

+ 746 - 0
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/public.css

@@ -0,0 +1,746 @@
+@charset "UTF-8";
+.scrollbar-none::-webkit-scrollbar {
+  display: none;
+}
+
+body {
+  color: #171826;
+  line-height: 1.6;
+}
+
+input,
+textarea {
+  caret-color: #2cb7ca;
+}
+
+.error-tip {
+  display: none;
+  color: #FB483D;
+  font-size: .24rem;
+}
+
+/*禁止长按复制 加给body*/
+.no-touch {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.j-pd {
+  padding-left: 0.32rem;
+  padding-right: 0.32rem;
+}
+
+.j-arrow {
+  display: inline-block;
+  width: 0.26rem;
+  height: 0.26rem;
+  border: 2px solid #5f5e64;
+  border-bottom-color: transparent;
+  border-right-color: transparent;
+  background: 0 0;
+  transform: rotate(-45deg);
+}
+
+.highlight-text {
+  color: #2cb7ca;
+}
+
+.j-container {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  height: 100%;
+}
+
+.j-header {
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-height: 0.88rem;
+  padding: 26px 0.24rem 6px;
+  padding: 30px 0.24rem 0.14rem;
+  font-size: 0.36rem;
+  font-size: 17px;
+  background-color: #fff;
+}
+
+.j-header:after {
+  content: '';
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  width: 100%;
+  height: 1px;
+  background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.1) 65%, transparent 35%);
+}
+
+.j-header .header-left,
+.j-header .header-title,
+.j-header .header-right {
+  display: flex;
+  align-items: center;
+}
+
+.j-header .header-left {
+  color: #5f5e64;
+  color: #444;
+  font-size: 0.4rem;
+}
+
+.j-header .header-title {
+  color: #171826;
+}
+
+.j-header .header-right {
+  height: 100%;
+  min-width: 0.4rem;
+  font-size: 0.3rem;
+}
+
+.j-body {
+  flex: 1;
+  overflow-y: scroll;
+  overflow-x: hidden;
+}
+
+.j-footer {
+  box-shadow: 0px -2px 8px rgba(54, 147, 179, 0.051);
+}
+
+@keyframes ballRotate {
+  0% {
+    transform: rotate(0);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+.ball-clip-rotate {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  z-index: 2;
+  transform: translate(-50%, -50%);
+}
+
+.ball-clip-rotate .ball {
+  display: inline-block;
+  width: 26px;
+  height: 26px;
+  border-radius: 50%;
+  border: 3px solid #fff;
+  border-bottom-color: transparent;
+  background: 0 0;
+  -webkit-animation: ballRotate 0.75s 0s linear infinite;
+  animation: ballRotate 0.75s 0s linear infinite;
+}
+
+.j-mask {
+  position: fixed;
+  z-index: 1000;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+}
+
+.black {
+  background: rgba(0, 0, 0, 0.6);
+}
+
+.j-loading {
+  display: none;
+}
+
+.j-loading .j-toast {
+  position: fixed;
+  top: 45%;
+  left: 50%;
+  z-index: 1001;
+  padding: 0.2rem;
+  min-width: 2.2rem;
+  max-width: 6.2rem;
+  width: auto;
+  height: auto;
+  color: #fff;
+  font-size: 0.28rem;
+  text-align: center;
+  background: rgba(18, 18, 18, 0.7);
+  border-radius: 5px;
+  transform: translate(-50%, -50%);
+}
+
+.j-loading .j-toast.icon {
+  padding: 0.5rem 0.2rem;
+}
+
+.j-loading .j-toast.icon .j-toast_icon {
+  display: inline-block;
+  width: 38px;
+  height: 38px;
+}
+
+.j-loading .j-toast .j-toast_icon {
+  display: none;
+}
+
+.j-loading .j-toast .j-toast_content {
+  text-align: center;
+}
+
+.j-loading-icon {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  vertical-align: baseline;
+  background: transparent url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E9E9E9' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23989697' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%239B999A' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23A3A1A2' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23ABA9AA' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23B2B2B2' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23BAB8B9' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23C2C0C1' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23CBCBCB' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23D2D2D2' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23DADADA' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E2E2E2' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E") no-repeat;
+  background-size: 100%;
+  -webkit-animation: ballRotate 1s steps(12) infinite;
+  animation: ballRotate 1s steps(12) infinite;
+}
+
+.j-button-group {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  padding: 0.16rem 0.32rem 0.24rem;
+  background-color: #fff;
+}
+
+.j-button-confirm, .j-picker .weui-half-screen-dialog__ft .weui-picker__btn,
+.j-button-cancel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+  width: 100%;
+  height: 0.92rem;
+  font-size: 0.32rem;
+  line-height: inherit;
+  text-align: center;
+  border-radius: 0.16rem;
+}
+
+.j-button-cancel {
+  margin-right: 0.26rem;
+  color: #5f5e64;
+  background-color: #edeff2;
+}
+
+.j-button-confirm, .j-picker .weui-half-screen-dialog__ft .weui-picker__btn {
+  color: #fff;
+  background-color: #2cb7ca;
+}
+
+button[disabled] {
+  opacity: 0.5;
+}
+
+.j-cells {
+  position: relative;
+  width: 100%;
+  font-size: 0.32rem;
+  background-color: #fff;
+}
+
+.j-cells:before, .j-cells:after {
+  content: '';
+  position: absolute;
+  left: 0;
+  right: 0;
+  width: 100%;
+  height: 1px;
+  background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.05) 70%, transparent 30%);
+}
+
+.j-cells:before {
+  top: 0;
+}
+
+.j-cells:after {
+  bottom: 0;
+}
+
+.j-cell {
+  position: relative;
+  display: flex;
+  align-items: center;
+  padding-left: 0.32rem;
+  width: 100%;
+  min-height: 1.08rem;
+  overflow: hidden;
+}
+
+.j-cell .j-cell_left {
+  margin-right: 0.28rem;
+  white-space: nowrap;
+}
+
+.j-cell .j-cell_right {
+  padding-right: 0.32rem;
+  display: flex;
+  align-items: center;
+  flex: 1;
+  height: 100%;
+}
+
+.j-cell .j-cell_right:after {
+  content: '';
+  position: absolute;
+  left: 1.04rem;
+  right: 0;
+  bottom: 0;
+  width: 100%;
+  height: 1px;
+  background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.05) 80%, transparent 20%);
+}
+
+.j-cell .j-cell_right .iconfont {
+  margin-left: 0.2rem;
+}
+
+.j-cell .j-cell_right .j-cell_rl {
+  flex: 1;
+}
+
+.j-cell:last-of-type .j-cell_right:after {
+  height: 0;
+  border-top: 0;
+}
+
+.j-cells.without-icon .j-cell {
+  justify-content: space-between;
+}
+
+.j-cells.without-icon .j-cell_right:after {
+  left: 0.32rem;
+}
+
+.j-cells.without-icon .j-cell_right {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  max-width: 65%;
+}
+
+.j-cells.without-icon .j-cell_right:after {
+  left: 0.32rem;
+}
+
+.j-cells.with-sub-info {
+  margin: 0.2rem 0.24rem;
+  width: auto;
+  border-radius: 0.16rem;
+}
+
+.j-cells.with-sub-info:before, .j-cells.with-sub-info:after {
+  height: 0;
+}
+
+.j-cells.with-sub-info .j-cell_right:after {
+  left: 0.32rem;
+}
+
+.j-cells.with-sub-info .j-cell {
+  flex-direction: column;
+  justify-content: space-between;
+  padding-top: 0.24rem;
+  padding-bottom: 0.24rem;
+  color: #9b9ca3;
+  font-size: 0.28rem;
+}
+
+.j-cells.with-sub-info .cell-hd {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 100%;
+}
+
+.j-cells.with-sub-info .cell-ft {
+  padding-right: 0.32rem;
+  width: 100%;
+}
+
+.j-cells.with-sub-info .j-cell_left {
+  color: #171826;
+  font-size: 0.36rem;
+}
+
+.j-cells.with-sub-info .j-cell_right {
+  flex-wrap: nowrap;
+  justify-content: flex-end;
+  max-width: 65%;
+}
+
+.border-all {
+  position: relative;
+}
+
+.border-all:after {
+  content: '';
+  position: absolute;
+  left: 0;
+  top: 0;
+  z-index: -1;
+  width: 200%;
+  height: 200%;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  -webkit-transform: scale(0.5, 0.5);
+  transform: scale(0.5, 0.5);
+}
+
+.weui-dialog {
+  left: 0.72rem;
+  right: 0.72rem;
+  border-radius: 0.16rem;
+}
+
+.weui-skin_android .weui-dialog__btn,
+.weui-dialog__btn {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  height: 100%;
+  color: #2cb7ca;
+  font-size: 0.36rem;
+  font-weight: 400;
+}
+
+.weui-skin_android .weui-dialog__btn {
+  border-left: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.weui-skin_android .weui-dialog__btn:first-of-type {
+  border-left: 0;
+}
+
+.weui-skin_android .weui-dialog__btn:after,
+.weui-dialog__btn:after {
+  transform: scale(1);
+}
+
+.weui-skin_android .weui-dialog__btn:last-child {
+  margin: 0;
+}
+
+.weui-skin_android .weui-dialog__btn_default,
+.weui-dialog__btn_default {
+  color: #171826;
+}
+
+.weui-skin_android .weui-dialog__btn_primary,
+.weui-dialog__btn_primary {
+  color: #2cb7ca;
+}
+
+.weui-skin_android .weui-dialog__btn_warning,
+.weui-dialog__btn_warning {
+  color: #fb483d;
+}
+
+.weui-skin_android .weui-dialog__bd,
+.weui-dialog__bd {
+  margin: 0.44rem 0.4rem 0.44rem;
+  padding: 0;
+  min-height: auto;
+  font-size: 0.32rem;
+  color: #171826;
+  text-align: center;
+}
+
+.weui-dialog__bd:first-child {
+  padding: 0;
+}
+
+.weui-skin_android .weui-dialog__ft,
+.weui-dialog__ft {
+  display: flex;
+  padding: 0;
+  height: 0.92rem;
+  border-top: 1px solid #efeffe;
+  text-align: center;
+}
+
+.j-alert .weui-dialog__hd {
+  padding: 0.48rem 0.4rem 0;
+  color: #1d1d1d;
+  text-align: center;
+}
+
+.j-alert .weui-dialog__hd .weui-dialog__title {
+  font-size: 0.34rem;
+  font-weight: 700;
+}
+
+.j-dialog .weui-dialog__hd {
+  background: #f5f4f9;
+  padding: 0.17rem 0;
+  color: #000;
+  font-size: 0.34rem;
+  text-align: center;
+}
+
+.j-dialog .weui-dialog__ft:after {
+  border: 0;
+}
+
+.weui-toast {
+  font-size: 0.3rem;
+  padding: 0.15rem 0.2rem;
+  max-width: 6rem;
+  min-height: 0;
+  width: auto;
+  height: auto;
+  top: 45%;
+  left: 50%;
+  margin-left: 0;
+  transform: translate(-50%, -50%);
+}
+
+.j-toast .weui-icon_toast {
+  display: none;
+}
+
+.j-toast .weui-toast__content {
+  margin: 0;
+}
+
+.j-toast-icon .weui-toast {
+  width: 2.2rem;
+  height: 2.2rem;
+  padding: 0.2rem 0.2rem;
+}
+
+.j-toast-icon .weui-icon_toast {
+  margin: 0.1rem 0 0;
+}
+
+.j-toast-icon .weui-toast__content {
+  margin: 0;
+}
+
+.j-switch {
+  box-sizing: border-box;
+  position: relative;
+  width: 1.04rem;
+  height: 0.64rem;
+  border: 2px solid #edeff2;
+  border-radius: 0.32rem;
+  background-color: #edeff2;
+  outline: 0;
+  -webkit-transition: background-color 0.1s, border 0.1s;
+  transition: background-color 0.1s, border 0.1s;
+  -webkit-appearance: none;
+}
+
+.j-switch:before {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  border-radius: 0.32rem;
+  background-color: #edeff2;
+  -webkit-transition: -webkit-transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+  transition: -webkit-transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+  transition: transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+  transition: transform 0.35s cubic-bezier(0.45, 1, 0.4, 1), -webkit-transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
+}
+
+.j-switch:after {
+  content: '';
+  position: absolute;
+  top: 50%;
+  left: 0.04rem;
+  margin-top: -0.26rem;
+  width: 0.52rem;
+  height: 0.52rem;
+  border-radius: 50%;
+  background-color: #fff;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
+  -webkit-transition: -webkit-transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+  transition: -webkit-transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+  transition: transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+  transition: transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35), -webkit-transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
+}
+
+.j-switch:checked {
+  border-color: #2cb7ca;
+  background-color: #2cb7ca;
+}
+
+.j-switch:checked:before {
+  transform: scale(0);
+}
+
+.j-switch:checked:after {
+  transform: translateX(0.4rem);
+}
+
+.j-picker.adaption .weui-half-screen-dialog__bd {
+  flex: 1;
+}
+
+.j-picker.adaption .weui-half-screen-dialog__bd .weui-picker__bd {
+  height: auto;
+}
+
+.j-picker .weui-picker {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  padding: 0 0.32rem;
+  min-height: 6.24rem;
+}
+
+.j-picker .weui-half-screen-dialog {
+  max-height: 70%;
+}
+
+.j-picker .weui-half-screen-dialog__hd {
+  justify-content: space-between;
+  padding: 0.44rem 0.44rem 0.24rem 0;
+  width: 100%;
+}
+
+.j-picker .weui-half-screen-dialog__hd .weui-half-screen-dialog__hd__main {
+  flex: none;
+  order: 1;
+  padding: 0;
+  text-align: left;
+}
+
+.j-picker .weui-half-screen-dialog__hd .weui-half-screen-dialog__hd__main .weui-half-screen-dialog__title {
+  color: #171826;
+  font-size: 0.4rem;
+  font-weight: normal;
+}
+
+.j-picker .weui-half-screen-dialog__hd .weui-half-screen-dialog__hd__side {
+  order: 2;
+}
+
+.j-picker .weui-half-screen-dialog__hd .weui-half-screen-dialog__hd__side .weui-picker__btn {
+  color: #c0c4cc;
+  font-size: 0.42rem;
+}
+
+.j-picker .weui-half-screen-dialog__bd {
+  font-size: 0.36rem;
+}
+
+.j-picker .weui-half-screen-dialog__ft {
+  padding: 0.16rem 0 0.24rem;
+}
+
+.j-picker .weui-half-screen-dialog__ft .weui-picker__btn {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin: 0;
+  padding: 0;
+  color: #f7f9fa;
+  font-size: 0.36rem;
+  font-weight: 400;
+}
+
+.j-tab-triangle {
+  position: relative;
+}
+
+.j-tab-triangle:after {
+  content: '';
+  position: absolute;
+  top: 50%;
+  right: 0;
+  width: 0;
+  height: 0;
+  font-size: 0;
+  line-height: 0;
+  border-style: solid;
+  border-width: 0.1rem;
+  border-color: #aaa transparent transparent transparent;
+  transform: translate(140%, -30%);
+}
+
+.j-tab-triangle.active:after {
+  border-color: transparent transparent #2cb7ca transparent;
+  transform: translate(140%, -70%);
+}
+
+.j-tab-triangle.current {
+  color: #2cb7ca;
+}
+
+.j-tab-triangle.current:after {
+  border-color: #2cb7ca transparent transparent transparent;
+}
+
+.checkbox {
+  width: 0.4rem;
+  height: 0.4rem;
+  border: 1px solid #ddd;
+  border-radius: 50%;
+  margin-right: 0.2rem;
+  -webkit-appearance: none;
+  background: #fff;
+}
+
+.checkbox:checked {
+  border: 0;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACpElEQVRogc1asa2DMBBlhIyQMpKNxAiMwAiMwAhswAgZgQrOHSVwLhiBERghvwCSwMdgOzYG6aQUhLw7v3u+Z+J5Bq4g724U6pCUTeIznlGGHQHsKcOBAPbT544yntOiTSnUoYnf/Rm0X7YRAXxShgMFfCkH4zkBjE8HTos21QYtCJ/xzDpwAhgTwN4k8OWK4GBlRYK8u1HGc2vA/yfSPaC+GwFPoQ6tVn1vNQoMfgJPyiYxzXXl3ijbSA88YOwa/BzKfUEKDK4C/hOSe8cD6vv1wOOLMhykGvtUtVFPotunDmDsHORBCPth1PoLUmeDStvUKdrUObgxqinE9xRt+q/6TjarZWW79cZFGXaiVQjy7va+0S/byDX4LYUhZZOIvrPoBafKw7BbVFOW1ozn7pt3B/xe9ed4QH33KNSho+pXv4CngC9SNon0zVcDTwFHNTqb/wTwqcX5TQry3KNHmmswfMYzEXif8Uz5mQwHT1r/55MGC+AJ4FPruVIJrJwRhToUbjA74LeATxuoHvg5gSMJFf24bO9YAy+7AgTwuQVAirfrmeULvBHxYDhINTEpm0SYhGgMsQ1+LG4v3f17B09rCyqa2Y0fzzCeq8pXJUpiPB/F6jTwc1GVJ1GNQ6dp3lJSLqkEyjbSG+YYDrKnBA+o77a8xruQunK219yeN/aGNaM0j9NTAvpmXqA2VsHDSigMWMrFdDnt1vY8xtpSep4hUz+qTGXbIG1K+iWMvW7137x1Y27UQtBzHyqd6A80qi/00AsqXfKETuWFh0OjLwSv/KLjSkkcbZjXTYLhoA3eeRI6tBFd86h8Inhzr1m/L+v7xESZQ6m8XCJnARckoketca+paNGmVuiievllG032tKKjtezf1f36u43PeEYAY1PV/gMeU6lGAhyHxgAAAABJRU5ErkJggg==) no-repeat center center;
+  background-size: 100% 100%;
+}
+
+.checkbox.transparent:checked {
+  border: 0;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHBSURBVHgBzZiPcYIwFIeDE7hB6QR1gzqCG2g3cAPtBLqBdoK6Ae0EXCd4bmA3+PW9JlxTJEJCgnx37xQSku9IyL9MeQIg558FxxPHnGNqQvjmOJv45DhlWXZWKWCRFUcBf0p5VsWCC5tzEPpDvcT44SnHDvGRMqe+Mjn0q04FQffFzjKE9FCrFHQzEYZDWuFf801qThuOXA3HzNR5DfRnfS/mlUdmCZEa9u3YnHkAfZQ/EyOzGkjmyPHWcD+HPUYh7SdesbXqOzakF1VijvRs7dfB1wdHvgdJXCMtdZnljbxryfCOccgIh1v9h6CbM3Qa8ZX5rVMyXtoKhB7Bfd5kiIxwUTcSCbW5hq/38JdZwAPVkk4NUlt0l5nB3QJOobYHqKNUbxmYJqMuGaWCWoX23HeMICOUrlHTxbKh4n0kGeEUMjA2LxdUlMXdOnTq2CSQEfKqsAL+7CLLlK4O6lUI9C4itM/YrMRlnAs0w4u6H6+Nd9FtaojN3qkJPYkOsXqsILTtYjGmjeKAUmVnmVrzpehTUqbfYUNNTMYoQn8I1oawN0YspMMX8DgXypQn+DvSe1Z6IJWwj/QkPji+VMCR3g//T7SIqLP6vQAAAABJRU5ErkJggg==) no-repeat center center;
+  background-size: 100% 100%;
+}
+
+.j-button {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 0.72rem;
+  padding: 0 0.2rem;
+  background-color: #f5f6f7;
+  color: #5f5e64;
+  border-radius: 0.08rem;
+}
+
+.j-button-item {
+  position: relative;
+  display: inline-block;
+  color: #171826;
+}
+
+.j-button-item.active {
+  color: #2abed1;
+  background-color: #e8fafd;
+}
+
+.j-button-item.active:after {
+  content: '';
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  width: 0.24rem;
+  height: 0.24rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKySURBVHgB7Zg/aNRQHMd/eXfWP6i9omJBhBOXa0W4bK6ni6Murro76Cgu1kF0aysOjnXTyTopLkEcHM8TxIMOHghFQfBAaUtp8/P9Qt+Rpnm99y+XBO6zXJJ7gc83v+S9XwIwZsyY0jIbdB54UFIuBF/mEfFu6QLUX7drR2qVeUC8RfulChDJT7KAbzbFsdIEaLxt19nBSL4eP16KADJ5ovAB9pMnCh1g9n276VVZgAA12RgGBaURdG4OkycKWYGZoHPHQ1hQGVu4CkSrq6I8UagKkDwgzOmcU5gAojUATXIPkGwNdMk1QFproEtuAYYtUKrkEsCVPDHyAC7liZEGUGkNdBnZQqbaGugykgrotAa6ZF4B3dZAlwpkiElrILg2PQVL/nm4ceYE/N3ahu6/jdRxmd1Cpq0BQfKPZs4O9inApY9fU8dWwTGiNUDD1iApT1AAGU4DDFoDRKPWIE2eePb9l/QcZ7eQ7QIlk7//7Qe8+flHep6TAHnJE9azUFJedfYQ2MgTVgGoNWAT7BPfnBbHnl6sw8mJA3C8WoErpyZhdWNTGsJWntM3XshkrQGJxyFBEk3iQJ7oGVWAWgOG8JxvHkr+93tzK7rycZKVcCTPn2B8px1gpzV4IvufJElWFqJx9LAbeU6IuKg1C+m0BrKrnIaJPLHmhVPKFaDWgMvfUx0vq0QSU3l++yyttPxXQ1dim9ZgeUdMVgljeU4I+JB+961A7KvBVTBEVgkbeURY7F5uvqRtaQVcvruKStw+dxqO8Wn28cqquTyfOtdZOCf2Ux9i1y/eriB59MJWt+X3xLE9C1mR5T0vvB6XJ3ZVIIuvBi5Iu/KCQQWy+mpgCz2w617op8kTUQWy/GpgSB8xfIEMFmTiAs/mxdshfX6te9zjM78pPqyx7eVey++rnPgfnLxxiLvERTEAAAAASUVORK5CYII=) no-repeat;
+  background-size: contain;
+}

文件差异内容过多而无法显示
+ 4 - 0
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/css/weui.min.css


文件差异内容过多而无法显示
+ 3 - 0
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.css


二进制
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.eot


二进制
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.ttf


二进制
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.woff


二进制
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/iconfont/iconfont.woff2


+ 393 - 0
src/jfw/modules/app/src/web/staticres/jyapp/commonPay/js/common.js

@@ -0,0 +1,393 @@
+// 头部返回按钮事件
+$('.j-header .header-left').on('click', function () {
+    window.history.back()
+})
+
+window.afterClickBack = function () {
+  console.log('afterClickBack', location.href)
+}
+
+var vTools = {
+    loadingTransition: 300,
+    // 传入你要获取的参数的名字
+    getParam: function (name) {
+        var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
+        var r = window.location.search.substr(1).match(reg); //获取url中'?'符后的字符串并正则匹配
+
+        var context = '';
+        if (r != null) context = r[2];
+        // 释放变量
+        reg = null;
+        r = null;
+        return context == null || context == '' || context == 'undefined' ? '' : context;
+    },
+    // 格式化金钱的函数
+    // s: 金额(number) 必传
+    // n: 保留小数的位数(int:0-100)
+    formatMoney: function (s, n) {
+        if (n === undefined) {
+            n = -1
+        } else {
+            n = n > 0 && n <= 20 ? n : 2;
+        }
+        var intS = parseInt(s)
+        var point = '.'
+        var left;
+        var right;
+        s = parseFloat((s + '').replace(/[^\d\.-]/g, ''))
+        // 没传n,默认(如果为整数,则不保留小数。如果为浮点数,则保留两位小数)
+        if (n === -1) {
+            if (s === intS) {
+                n = 0
+                right = ''
+                point = ''
+            } else {
+                n = 2
+                s = s.toFixed(n);
+                right = s.split('.')[1];
+            }
+            s = s + ''
+            left = s.split('.')[0].split('').reverse();
+        } else {
+            s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(n) + '';
+            left = s.split('.')[0].split('').reverse();
+            right = s.split('.')[1];
+        }
+
+        t = '';
+        for (i = 0; i < left.length; i++) {
+            t += left[i] + ((i + 1) % 3 == 0 && (i + 1) != left.length ? ',' : '');
+        }
+
+        var money = t.split('').reverse().join('') + point + right;
+        return money;
+    },
+    // 解决ios返回不刷新页面的问题
+    iosBackRefresh: function () {
+        var isPageHide = false;
+        window.addEventListener('pageshow', function () {
+            if (isPageHide) {
+                location.reload();
+            }
+        });
+        window.addEventListener('pagehide', function () {
+            isPageHide = true;
+        });
+    },
+    // 解决移动端软键盘弹起遮挡输入框及ios下软键盘关闭后底部留白问题
+    // 解决键盘弹起'.j-footer'往上顶的问题
+    // 原始代码在:jianyuMobile:vip_subscribe分支/trial_info.html
+    initScrollView: function (options) {
+        options.inputClassName = options.inputClassName || 'input'
+        options.bottom = options.bottom || '.j-footer'
+        options.exclude = options.exclude || 'exclude'
+        /*
+            options = {
+                // 输入框公共类名 String(为css选择器): 如'.j-input'
+                inputClassName: inputClassName,
+
+                // 底部按钮 String(为css选择器): 如'.j-footer'
+                bottom: bottomContainer,
+
+                // 排除的底部区域的button String(为字符串): 如'exclude',默认为'exclude'
+                // 如果底部区域是隐藏的,此时键盘弹起在收起,就会显示,加上一个排除的类名,就不会进行隐藏了
+                exclude: exclude
+
+                // =========废弃=========>
+                // view属性废弃,view属性是在底部元素使用定位时候用的
+                // 滚动区域 String(为css选择器): 如'.container'
+                // view: scrollView
+                // ======================>
+            }
+        */
+        var u = navigator.userAgent, app = navigator.appVersion;
+        var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
+
+        // var clientHeight = $(options.view).height()
+        // var clientHeight = document.documentElement.clientHeight || document.body.clientHeight
+        // function change() {
+        //     $(options.view || document.body).height(clientHeight)
+        // }
+
+        var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+        // change函数参考: https://blog.csdn.net/andyfine/article/details/82695236
+        function change() {
+            var footer = $(options.bottom)
+            // 首先判断footer此时有没有options.exclude的类名,有此类名则不会隐藏
+            // $('.ele').is(':hidden')
+            // $('.ele').is(':visible')
+            if (footer.hasClass(options.exclude)) return
+            if (document.body.scrollHeight < clientHeight) {
+                footer.hide()
+            } else {
+                footer.show()
+            }
+        }
+        // 给所有input绑定一个focus事件,用来判断键盘弹起。执行完成就解绑该事件
+        function focusOnce() {
+            $(options.inputClassName).on('focus', function (e) {
+                e.target.scrollIntoView({ 'block': 'center' })
+                $(options.inputClassName).off('focus')
+            })
+        }
+
+        if (isAndroid) {
+            // 在安卓中键盘弹起会触发window.onresize事件
+            // ios中则不会触发window.resize事件
+            change();
+            window.addEventListener('resize', change);
+        } else {
+            // 进入页面绑定,触发一次就解绑
+            focusOnce()
+        }
+
+        $(options.inputClassName).on('blur', function (e) {
+            setTimeout(function() {
+                var dom = document.activeElement;
+                if (dom.className.includes(options.inputClassName.replace(/\./g))) {
+                    if (isAndroid) {
+                        dom.scrollIntoView({ 'block': 'center' })
+                    } else {
+                        // dom.scrollIntoView({'block': 'bottom'})
+                    }
+                } else {
+                    window.scroll(0, 0)
+                    // 当页面上没有获得焦点的input时候就说明键盘收起来了。
+                    // 给input绑定focus事件用来监听其弹起
+                    focusOnce()
+                }
+            }, 50)
+        })
+    },
+    // 通过userAgent获取用户手机操作系统类型
+    androidOrIOS: function () {
+        var u = navigator.userAgent.toLowerCase();
+        var app = navigator.appVersion;
+        var agent = null;
+        if (/iphone|ipod|ipad|ios/.test(u)) {
+            agent = 'ios'
+        } else {
+            agent = 'android'
+        }
+        return agent
+    },
+    // 带动画的weui picker的显示隐藏
+    pickerAnimatedShow: function (selector, f) {
+        if (f) {
+            // 添加进场动画,并显示
+            $(selector).find('.weui-mask').removeClass('weui-animate-fade-out').addClass('weui-animate-fade-in')
+            $(selector).find('.weui-picker').removeClass('weui-animate-slide-down').addClass('weui-animate-slide-up')
+            $(selector).show(300);
+        } else {
+            // 添加离场动画,并隐藏
+            $(selector).find('.weui-mask').removeClass('weui-animate-fade-in').addClass('weui-animate-fade-out')
+            $(selector).find('.weui-picker').removeClass('weui-animate-slide-up').addClass('weui-animate-slide-down')
+            $(selector).hide(300);
+        }
+    },
+    // 键盘弹起和收起的事件(只在安卓有效果)
+    keyboardUpAndDown: function (upCallBack, downCallBack) {
+        var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+        $(window).on('resize', function () {
+            var nowClientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+            if (clientHeight > nowClientHeight) {
+                // 键盘弹出的事件处理
+                upCallBack && upCallBack()
+                console.log('键盘弹出')
+            }
+            else {
+                // 键盘收起的事件处理
+                downCallBack && downCallBack()
+                console.log('键盘收起')
+            }
+        });
+    },
+    // 取[m, n]随机数
+    getRandomNumber: function (min, max) {
+        return Math.floor(Math.random() * (max - min + 1) + min);
+    },
+    // 获取唯一的uuid
+    // https://www.kancloud.cn/ifeng/js100/622666
+    getRandomUuid: function () {
+        var s = [];
+        var hexDigits = "0123456789abcdef";
+        for (var i = 0; i < 36; i++) {
+            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
+        }
+        s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
+        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
+        s[8] = s[13] = s[18] = s[23] = "-";
+
+        var uuid = s.join("");
+        return uuid;
+    },
+    // 获取随机字符串
+    // 不传参数则获取长度不固定的字符串
+    getRandomString: function (len) {
+        var randomString = '';
+        if (len) {
+            /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
+            var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
+            var maxPos = $chars.length;
+            for (i = 0; i < len; i++) {
+                randomString += $chars.charAt(Math.floor(Math.random() * maxPos));
+            }
+        } else {
+            // Math.random()  生成随机数字, eg: 0.123456
+            // .toString(36)  转化成36进制 : "0.4fzyo82mvyr"
+            // .substring(2)  去掉前面两位 : "yo82mvyr"
+            // .slice(-8)  截取最后八位 : "yo82mvyr"
+            randomString = Math.random().toString(36).substring(2)
+        }
+        return randomString;
+    },
+    // 全局loading框
+    jLoading: function(options) {
+        // 设置options参数的默认值
+        options.content = options.content || 'loading...'
+        options.bgc = options.bgc || 'transparent'
+        options.icon = options.icon || 'j-loading-icon'
+        options.duration = options.duration || 0
+        // 将其拼接成width: 5rem;的形式
+        options.width = options.width ? 'width:' + options.width + ';' : ''
+        // 结构
+        // <div class="j-loading">
+        //     <div class="j-mask"></div>
+        //     <div class="j-toast">
+        //         <i class="j-toast_icon j-loading-icon"></i>
+        //         <p class="j-toast_content">loading</p>
+        //     </div>
+        // </div>
+
+        var that = this
+        var bgcClassMap = {
+            transparent: '',
+            black: 'black'
+        }
+
+        var icon = options.iconHide ? '' : 'icon';
+        var html = '<div class="j-loading"><div class="j-mask ' + bgcClassMap[options.bgc] + '"></div><div class="j-toast '+ icon +'" style="' + options.width + '"><i class="j-toast_icon ' + options.icon + '"></i><p class="j-toast_content">' + options.content + '</p></div></div>'
+        var _html = $(html)
+        $('body').append(_html)
+        _html.fadeIn(this.loadingTransition)
+
+        var _loading = {
+            _html: _html,
+            hide: function(callback) {
+                this._html.fadeOut(that.loadingTransition, function() {
+                    this.remove()
+                    callback && callback()
+                })
+            }
+        }
+
+        if (options.duration > 0) {
+            setTimeout(function() {
+                _loading.hide(options.callback)
+            }, options.duration)
+        }
+
+        return _loading
+    },
+    splitPhone: function(phone) {
+        return String(phone).replace(/\s/g, '').replace(/(?=(\d{4})+$)/g, ' ')
+    },
+    // https://blog.csdn.net/jacoox/article/details/80719456
+    // https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/129、https://segmentfault.com/a/1190000012490380
+    // 防抖: 其中 func 为需要进行防抖操作的函数(如发送联想请求的函数),delay 为延迟时间
+    debounce: function(func, delay) {
+        var timer = null
+        return function() {
+            var _this = this
+            var _arg = arguments
+            clearTimeout(timer)
+            timer = setTimeout(function() {
+                func.apply(_this, _arg)
+            }, delay)
+        }
+    },
+    // 节流: 其中 func 为需要进行节流操作的函数,wait为等待时间
+    throttle: function(func, wait) {
+        var lastTime = 0
+        return function(e) {
+            var now = +new Date()
+            if (now - lastTime > wait) {
+                func.apply(this, arguments)
+                lastTime = now
+            }
+        }
+    },
+    isWeiXinBrower: function() {
+        var ua = navigator.userAgent.toLowerCase();
+        if(ua.match(/MicroMessenger/i) == 'micromessenger') {
+          return true;
+        } else {
+          return false;
+        }
+    },
+    // 解决 客户端2.9.5 replace失效问题
+    locationReplace: function (url){
+      if(history.replaceState){
+        history.replaceState(null, document.title, url);
+        history.go(0);
+      }else{
+        location.replace(url);
+      }
+    },
+}
+
+
+/*
+   * 时间格式化函数(将时间格式化为,2019年08月12日,2019-08-12,2019/08/12的形式)
+   *
+   *
+   *   pattern参数(想要什么格式的数据就传入什么格式的数据)
+   *     · 'yyyy-MM-dd'  ---> 输出如2019-09-20
+   *     · 'yyyy-MM-dd hh:mm'  --->  输出如2019-09-20 08:20
+   *     · 'yyyy-MM-dd hh:mm:ss'  --->  输出如2019-09-20 08:20:23
+   *     · 'yyyy/MM/dd'  --->  输出如2019/09/20
+   *     · 'yyyy年MM月dd日'  --->  输出如2019年09月20日
+   *     · 'yyyy年MM月dd日 hh时mm分'  --->  输出如2019年09月20日 08时20分
+   *     · 'yyyy年MM月dd日 hh时mm分ss秒'  --->  输出如2019年09月20日 08时20分23秒
+   *     · 'yyyy年MM月dd日 hh时mm分ss秒 EE'  --->  输出如2019年09月20日 08时20分23秒 周二
+   *     · 'yyyy年MM月dd日 hh时mm分ss秒 EEE'  --->  输出如2019年09月20日 08时20分23秒 星期二
+   *
+   *  参考: https://www.cnblogs.com/mr-wuxiansheng/p/6296646.html
+   */
+Date.prototype.pattern = function (fmt) {
+    var o = {
+        'y+': this.getFullYear(),
+        'M+': this.getMonth() + 1, //月份
+        'd+': this.getDate(), //日
+        'h+': this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时
+        'H+': this.getHours(), //小时
+        'm+': this.getMinutes(), //分
+        's+': this.getSeconds(), //秒
+        'q+': Math.floor((this.getMonth() + 3) / 3), //季度
+        'S': this.getMilliseconds(), //毫秒
+        'E+': this.getDay(), // 周
+    };
+    var week = {
+        '0': '日',
+        '1': '一',
+        '2': '二',
+        '3': '三',
+        '4': '四',
+        '5': '五',
+        '6': '六'
+    };
+    if (/(y+)/.test(fmt)) {
+        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
+    }
+    if (/(E+)/.test(fmt)) {
+        fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '星期' : '周') : '') + week[
+            this.getDay() + '']);
+    }
+    for (var k in o) {
+        if (new RegExp('(' + k + ')').test(fmt)) {
+            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
+                .length)));
+        }
+    }
+    return fmt;
+}

+ 4 - 1
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_index_new.js

@@ -785,7 +785,10 @@ $(function () {
             if (r.success) {
                 if (r.data.needPay) {
                     //创建支付订单
-                    window.location.replace("/jyapp/vipsubscribe/toSelectPayWay?orderCode=" + r.data.code + "&price=" + submitPrice);
+                    //window.location.replace("/jyapp/vipsubscribe/toSelectPayWay?orderCode=" + r.data.code + "&price=" + submitPrice);
+                    clearSessionStorage()
+                    history.replaceState({}, '', '/jyapp/vipsubscribe/toOrderDetailPage?orderCode='+r.data.code);
+                    window.location.href="/jyapp/pay/checkout_vip?orderCode="+r.data.code
                 } else {
                     //订阅修改
                     if (r.data.doSuccess) {

+ 1 - 1
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_order_detail.js

@@ -713,7 +713,7 @@ $(function () {
 var orderCode_ = decodeURIComponent(getParam("orderCode"));
 //选择
 function choosePayWay() {
-  window.location.href = "/jyapp/course/optionPay?code=" + orderCode_
+  window.location.href = "/jyapp/pay/checkout_vip?orderCode=" + orderCode_
 }
 //订单详情
 $(".icon-fanhui").on("click", function () {

+ 7 - 10
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_renew.js

@@ -450,11 +450,11 @@ $(function() {
 			industry = [];
 		}
 		//优惠码
-		var activeCode = $('.coupon-picker .weui-input').val();
+		/*var activeCode = $('.coupon-picker .weui-input').val();
 		var activeCodes = "";
 		if (activeCode.toLowerCase() === couponInfo.code && $('.coupon-code-tx .keywords-text').text() === couponInfo.successTip){
 			activeCodes = couponInfo.code;
-		}
+		}*/
 		//付费用户
 		var param = {
 			"area": JSON.stringify(area),
@@ -462,17 +462,13 @@ $(function() {
 			"time": purchase.timeValue.trim(),
 			"payWay": purchase.payWay,
 			"orderType": 5,
-			"activeCode": activeCodes
 		};
 		$DoPost("/subscribepay/vipsubscribe/createOrder", param, function(r) {
 			if (r.success) {
 				try {
-					if (param.payWay === "wx_app") {
-						JyObj.wxPay(r.data.res)
-					} else {
-						JyObj.aliPay(r.data.res)
-					}
-					checkpay(r.data.code)
+					clearSessionStorage()
+					history.replaceState({}, '', '/jyapp/vipsubscribe/toOrderDetailPage?orderCode='+r.data.code);
+					window.location.href="/jyapp/pay/checkout_vip?orderCode="+r.data.code
 				} catch (e) {
 					showToast(e)
 				}
@@ -524,6 +520,7 @@ function pickerShow(selector, f) {
 
 //app支付 公共方法
 //查询是否支付完成
+/*
 var interval;
 
 function checkpay(orderid) {
@@ -621,4 +618,4 @@ $('.coupon-code-tx').on('click', function() {
 			cancelButton.trigger('click')
 		}
 	})
-})
+})*/

+ 295 - 0
src/jfw/modules/app/src/web/templates/commonPay/checkout.html

@@ -0,0 +1,295 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <title>支付</title>
+    <script src="/js/rem.js"></script>
+    <link rel="stylesheet"
+          href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/css/weui.min.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet"
+          href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/css/base.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet"
+          href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet"
+          href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/css/public.css?v={{Msg "seo" "version"}}">
+    <style>
+        .j-body .need-pay {
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            justify-content: center;
+            height: 1.6rem;
+        }
+
+        .need-pay {
+            margin-bottom: .2rem;
+            background-color: #fff;
+        }
+
+        .need-pay .tip-text {
+            color: #9B9CA3;
+            font-size: .24rem;
+        }
+
+        .price-container {
+            margin-top: .03rem;
+            color: #FB483D;
+            font-size: .32rem;
+        }
+
+        .price-container .price {
+            font-size: .4rem;
+        }
+
+        .j-cell .iconfont {
+            color: #2ABED1;
+            font-size: .48rem;
+        }
+
+        .j-cell .icon-weixinzhifu {
+            color: #09BB07;
+        }
+
+        .j-cell .icon-zhifubaozhifu {
+            color: #1296DB;
+        }
+
+        .j-cell .j-cell_right .iconfont {
+            visibility: hidden;
+        }
+
+        .j-cell.active .j-cell_right .iconfont {
+            visibility: visible;
+        }
+    </style>
+</head>
+
+<body>
+<div class="j-container">
+    <div class="j-header">
+        <span class="header-left iconfont icon-fanhui"></span>
+        <span class="header-title">支付</span>
+        <span class="header-right"></span>
+    </div>
+    <div class="j-body">
+        <div class="need-pay">
+            <div class="tip-text">需支付金额</div>
+            <div class="price-container">
+                <span class="yen">&yen;</span>
+                <span class="price"></span>
+            </div>
+        </div>
+        <div class="j-cells">
+            <div class="j-cell active" data-pay-mode="weixin">
+                <div class="j-cell_left iconfont icon-weixinzhifu"></div>
+                <div class="j-cell_right">
+                    <div class="j-cell_rl">微信支付</div>
+                    <div class="j-cell_rr iconfont icon-shezhichenggong"></div>
+                </div>
+            </div>
+            <div class="j-cell" data-pay-mode="ali-pay">
+                <div class="j-cell_left iconfont icon-zhifubaozhifu"></div>
+                <div class="j-cell_right">
+                    <div class="j-cell_rl">支付宝支付</div>
+                    <div class="j-cell_rr iconfont icon-shezhichenggong"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="j-footer j-button-group">
+        <button class="j-button-confirm">确认支付</button>
+    </div>
+</div>
+
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/jquery-3.2.1.min.js?v={{Msg "seo" "version"}}"></script>
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/js/common.js?v={{Msg "seo" "version"}}"></script>
+<script>
+    $(function () {
+        var checkout = {
+            modeMap: {
+                'weixin': 'wx_app',
+                'ali-pay': 'ali_app'
+            },
+            errorMap: {
+                0: '操作失败',
+                1: '操作成功'
+            },
+            mode: '',
+            orderInfo: {
+                ordercode: {{.T.orderCode}},
+                productType:{{.T.doType}},
+                totalPrice: '',
+            },
+            loading: null,
+            init: function () {
+                this.getOrderPrice()
+                this.clickEventsWithPayMode()
+                this.confirmPayEvent()
+            },
+            clickEventsWithPayMode: function () {
+                var that = this
+                $('.j-cells').on('click', '.j-cell_right', function () {
+                    $(this).parents('.j-cell').addClass('active').siblings().removeClass('active')
+                    var m = $('.j-cell.active').attr('data-pay-mode')
+                    that.mode = that.modeMap[m]
+                    console.log(that.mode);
+                })
+            },
+            getOrderPrice: function () {
+                this.loading = vTools.jLoading({
+                    content: '加载中...',
+                })
+                $.ajax({
+                    url: '/jypay/common/getOrderPrice',
+                    type: 'POST',
+                    data: {
+                        orderCode: checkout.orderInfo.ordercode,
+                    },
+                    contentType: 'application/x-www-form-urlencoded',
+                    success: function (res) {
+                        checkout.loading.hide(function () {
+                            checkout.loading = null
+                            if (res.success) {
+                                $(".price-container .price").text(vTools.formatMoney(res.data.price / 100));
+                            } else {
+                                vTools.jLoading({
+                                    content: res.errMsg,
+                                    iconHide: true,
+                                    duration: 1500
+                                })
+                            }
+                        })
+                    },
+                    error: function (err) {
+                        console.log(err);
+                    }
+                })
+            },
+            getOrderPay111: function () {
+                this.loading = vTools.jLoading({
+                    content: '加载中...',
+                })
+                $.ajax({
+                    url: '/jypay/common/getPayParam',
+                    type: 'POST',
+                    data: {
+                        orderCode: checkout.orderInfo.ordercode,
+                        dotype: checkout.orderInfo.productType,
+                        payway: checkout.mode,
+                    },
+                    contentType: 'application/x-www-form-urlencoded',
+                    success: function (res) {
+                        checkout.loading.hide(function () {
+                            checkout.loading = null
+                            if (res.success) {
+                                $(".price-container .price").text(vTools.formatMoney(res.data.price / 100));
+                                try {
+                                    checkout.orderInfo.payObj = JSON.parse(res.data.res);
+                                    checkout.confirmPayEvent()//支付点击事件
+                                } catch (e) {
+                                    vTools.jLoading({
+                                        content: "支付创建异常",
+                                        iconHide: true,
+                                        duration: 1500
+                                    })
+                                }
+                            } else {
+                                vTools.jLoading({
+                                    content: res.errMsg,
+                                    iconHide: true,
+                                    duration: 1500
+                                })
+                            }
+                        })
+                    },
+                    error: function (err) {
+                        console.log(err);
+                    }
+                })
+            },
+            confirmPayEvent: function () {
+                $('.j-button-confirm').on('click', function () {
+                    // 如果loading有值说明正在请求中
+                    if (checkout.loading) return
+                    // 开启加载动画
+                    checkout.loading = vTools.jLoading({
+                        content: '加载中...',
+                    })
+                    $.ajax({
+                        url: '/jypay/common/getPayParam',
+                        type: 'POST',
+                        data: {
+                            orderCode: checkout.orderInfo.ordercode,
+                            dotype: checkout.orderInfo.productType,
+                            payway: checkout.mode,
+                        },
+                        contentType: 'application/x-www-form-urlencoded',
+                        success: function (res) {
+                            checkout.loading.hide(function () {
+                                checkout.loading = null
+                                if (res.success) {
+                                    if (checkout.mode === 'wx_app') {
+                                        // 调微信支付
+                                        JyObj.wxPay(res.data.res)
+                                    } else if (checkout.mode === 'ali_app') {
+                                        // 调支付宝支付
+                                        JyObj.aliPay(res.data.res)
+                                    }
+                                    //校验支付完成
+                                    checkout.checkIsPaySuccess()
+                                } else {
+                                    vTools.jLoading({
+                                        content: res.errMsg,
+                                        iconHide: true,
+                                        duration: 1500
+                                    })
+                                }
+                            })
+                        },
+                        error: function (err) {
+                            console.log(err);
+                        }
+                    })
+                })
+            },
+            // 开启定时任务,3s查询一次是否支付成功
+            checkIsPaySuccess: function () {
+                var checkPaySuccessTimer = setInterval(function () {
+                    vTools.ajax({
+                        url: '/jypay/isPaySuccess',
+                        type: 'POST',
+                        data: {
+                            ordercode: checkout.orderInfo.ordercode
+                        },
+                        contentType: 'application/x-www-form-urlencoded',
+                        success: function (res) {
+                            if (res.success) {
+                                // 直到找到支付完成订单,关闭加载动画
+                                clearInterval(checkPaySuccessTimer)
+                                // 显示支付成功提示,成功后跳转
+                                vTools.jLoading({
+                                    content: '支付成功',
+                                    iconHide: true,
+                                    duration: 1500,
+                                    callback: function () {
+                                        location.replace("/jyapp/{{.T.doType}}/paySuccess?orderCode=" + res.orderCode + "&email=" + res.email + "&payTime=" + res.payTime + "&pay_way=" + pay_way)
+                                    }
+                                })
+                            }
+                        }
+                    })
+                }, 3000)
+            },
+        }
+        checkout.init()
+    })
+</script>
+</body>
+
+</html>

+ 100 - 0
src/jfw/modules/app/src/web/templates/commonPay/paySuccess.html

@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
+    <title>支付完成</title>
+    <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/rem.js"></script>
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/css/base.css?v={{Msg "seo" "version"}}"/>
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.css">
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/css/paySuccess.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css"/>
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}"/>
+</head>
+<body>
+<div class="app-layout-header jy-app-header">
+    <span class="app-back jyapp-icon jyapp-icon-zuojiantou"></span>
+    超级订阅
+    <span></span></div>
+<div class="app-layout-content-b">
+    <div class="vip_pay_success layout_top-bottom">
+        <div class="layou_top">
+            <div class="icon_box">
+                <i class="icon iconfont">&#xe612;</i>
+                <p>支付成功</p>
+            </div>
+            <div class="info_box">
+                <div class="pay_mode">
+                    <span>支付方式</span>
+                    <span class="payway"></span>
+                </div>
+                <div class="pay_time">
+                    <span>支付时间</span>
+                    <span class="paytime"></span>
+                </div>
+                <div class="pay_id">
+                    <span>订单编号</span>
+                    <span class="orderCode">{{.T.orderCode}}</span>
+                </div>
+            </div>
+        </div>
+        {{if eq .T.doType "vip"}}
+            <div class="bottom_button">
+                <button class="left_btn"
+                        onclick="window.location.href = '/jyapp/vipsubscribe/toOrderDetailPage?orderCode=' + {{.T.orderCode}}">
+                    查看订单
+                </button>
+                <button class="right_btn" onclick="window.location.href = '/jyapp/vipsubscribe/toSubVipSetPage'">VIP设置
+                </button>
+            </div>
+        {{end}}
+    </div>
+</div>
+</body>
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/jquery.min.js"></script>
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/commonPay/js/common.js?v={{Msg "seo" "version"}}"></script>
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.js"></script>
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "mod_version"}}"></script>
+<script>
+    $(function () {
+        try {
+            JyObj.hiddenBottom("0");
+        } catch (e) {
+        }
+        let payTime = {{.T.payTime}}
+        var doType = {{.T.doType}}
+        var payway ={{.T.pay_way}}
+            $(function () {
+                let payData
+                if (payTime) {
+                    payData = new Date(parseInt(payTime) * 1000)
+                } else {
+                    payData = new Date();
+                }
+                $(".paytime").text(payData.getFullYear() + "年" + (payData.getMonth() + 1) + "月" + payData.getDate() + "日");
+            })
+        let showPayway = "微信支付"
+        if (payway.indexOf("ali") > -1) {
+            showPayway = "支付宝支付"
+        }
+        $(".payway").text(showPayway)
+
+        if (doType==="vip"){
+            try {
+                JyObj.checkLab()//刷新搜索首页和订阅首页
+                sessionStorage.reloadHomePage = true;
+                sessionStorage.reloadSubPage = true;
+                JyObj.iosAfterPayHiddenBtm();//ios用来隐藏导航栏展示 (由于ios刷新了搜索首页和订阅首页,导致页面可能会是mainsearch的地址,会弹出导航栏)
+                setTimeout(function () {
+                    //ios 从我的菜单进入 保存关键词 底部导航会显示
+                    JyObj.hiddenBottom("0");
+                }, 500)
+            } catch (e) {
+            }
+        }
+    })
+</script>
+{{include "/common/baiducc.html"}}
+</html>

+ 12 - 16
src/jfw/modules/app/src/web/templates/dataExport/dataExport_payOrder.html

@@ -142,13 +142,13 @@
                         </div>
                     </div>
                 </div>
-                <div class="form-item" style="margin-top: .2rem;">
+                <!--<div class="form-item" style="margin-top: .2rem;">
                     <div class="way">
                         <span>支付方式</span>
                         <div class="way-right" id="choose_way"><span class="payment">微信支付</span><i
                                     class="iconfont icon-arrow icon-right"></i></div>
                     </div>
-                </div>
+                </div>-->
                 <p class="msg">购买须知:最低起售<span></span>元;标准字段包:原价<span></span>元/条、<span></span>
                     折价<span></span>元/条计费;高级字段包:原价<span></span>元/条、<span></span>
                     折价<span></span>元/条计费;</p>
@@ -338,9 +338,6 @@
         event.preventDefault();
         if (regInt.test($(".sendCode").text())) {
             var email_input = $(".email_input").val().replace(/\s*/g, "");
-//					if (/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/.test(email_input)){
-//						sessionStorage.setItem("send_email_"+{{.T._id}}, $(".email_input").val().replace(/\s*/g,""));
-//					}
         }
         if ($("#phone_input").val()) {
             sessionStorage.setItem("order_phone" +{{.T._id}}, $("#phone_input").val().replace(/\s*/g, ""));
@@ -433,10 +430,7 @@
                 $("#pay_order").css("padding-bottom", "2.7rem");
             }
         });
-        //	alert(sessionStorage.getItem("send_email_"+userId)!=null)
-        //  	alert(sessionStorage.getItem("send_code_"+userId)!=null)
-        //  	alert(sessionStorage.getItem("send_email_"+userId)==null)
-        //  	alert(localStorage.getItem("new_email_"+userId)!=null)
+
         //缓存  1.如果有sessionStorage邮箱 先显示此邮箱 再发送邮箱五分钟内 显示验证码输入框 2.如果没有 显示localStorage邮箱 3.如果都没得 显示email_lastInput数据库中邮箱
         if ((sessionStorage.getItem("send_email_" + userId) != null) && (sessionStorage.getItem("send_code_" + userId) != null)) {
             //alert("1")
@@ -820,8 +814,7 @@
                     $(".toPay").attr("disabled", "disabled");
                 }
                 sessionStorage.email_lastVerity = email_lastVerity;
-                window.location.href = "/jyapp/front/dataExport/previewData/"+{{.T._id}}+
-                "?dataType=" + dataType;
+                window.location.href = "/jyapp/front/dataExport/previewData/{{.T._id}}?dataType=" + dataType;
             } else {
                 EasyAlert.show("预览数据次数超出今日上限!", "", 3000);
             }
@@ -842,13 +835,16 @@
             }
             param.data_spec = dataType == 2 ? "senior" : "standard";
             param.id = {{.T._id}}
-                param.sourcePage = "weixin"
+            param.sourcePage = "weixin"
             //先去创建预支付订单
             /*-----------------*/
             $.post("/jypay/dataExport/app/createOrder", param, function (data) {
                 if (data.success) {
                     localStorage.setItem("new_email_" + userId, $(".email_input").val().replace(/\s*/g, ""));
-                    try {
+                    history.replaceState({}, '', '/jyapp/front/myOrder/toOrderDetail?orderCode='+data.order);
+                    window.location.href="/jyapp/pay/checkout_vip?orderCode="+data.order
+                    $(".loading_").hide();
+                    /*try {
                         if (pay_way == "wx_app") {
                             localStorage.setItem({{.T._id}}, "wx");
                             JyObj.wxPay(data.data);
@@ -859,10 +855,10 @@
                         checkPaySuccess(data.order);
                     } catch (e) {
                         alert(e);
-                    }
+                    }*/
+                }else {
+                    canpay = true;
                 }
-                $(".loading_").hide();
-                canpay = true;
             })
         })
         var interval

+ 18 - 11
src/jfw/modules/app/src/web/templates/dataExport/dataExport_paySuccess.html

@@ -8,21 +8,28 @@
 		<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/css/pay_success.css?v={{Msg "seo" "version"}}">
 		<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 		<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/appbutton.css?v={{Msg "seo" "version"}}"/>
-
 		<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/jquery.min.js"></script>
    		{{include "/common/js.html"}}
 		<script>
-			var email = {{.T.email}}
-			var orderCode = {{.T.orderCode}}
 			var payTime = {{.T.payTime}}
+			var payWay ={{.T.pay_way}}
 			$(function(){
-				$(".email").text(email);
-				$(".orderCode").text(orderCode);
-				payTime =  payTime.split("-")[0]+"年"+payTime.split("-")[1]+"月"+payTime.split("-")[2]+"日";
-				$(".payTime").text(payTime);
+				let payData
+				if (payTime) {
+					payData = new Date(parseInt(payTime) * 1000)
+				} else {
+					payData = new Date();
+				}
+				$(".payTime").text(payData.getFullYear() + "年" + (payData.getMonth() + 1) + "月" + payData.getDate() + "日");
+
+				if (payWay.indexOf(payWay,"wx")>-1){
+					$(".payWay").text("微信支付")
+				}else{
+					$(".payWay").text("支付宝支付")
+				}
+
 				$(".go_detail").click(function(){
 					window.location.href="/jyapp/front/myOrder/toOrderDetail?orderCode={{.T.orderCode}}"
-					//location.replace("/jyapp/front/myOrder/toOrderDetail?orderCode={{.T.orderCode}}");
 				})
 			})
 		</script>
@@ -87,11 +94,11 @@
 					<div class="order_lists">
 						<div class="item">
 							<span>邮箱地址</span>
-							<span  class="email"></span>
+							<span  class="email">{{.T.email}}</span>
 						</div>
 						<div class="item">
 							<span>支付方式</span>
-							<span>{{.T.pay_way}}支付</span>
+							<span class="payWay"></span>
 						</div>
 						<div class="item">
 							<span>支付时间</span>
@@ -99,7 +106,7 @@
 						</div>
 						<div class="item">
 							<span>订单编号</span>
-							<span class="orderCode"></span>
+							<span class="orderCode">{{.T.orderCode}}</span>
 						</div>
 					</div>
 				</div>

+ 3 - 3
src/jfw/modules/app/src/web/templates/dataExport/dataExport_toOrderDetail.html

@@ -762,7 +762,7 @@
 										$(".order-main").before(wait_html)
 										// startTimeOver(r.data.create_time,r.data.countdown)
 										var go_pay = ''
-										go_pay += '<div class="j-button-group" ><button class="j-button-confirm" id="buy" onclick="choosePayWay(\''+r.data.order_code+'\',\''+filter_id+'\')">立即支付</button></div>'
+										go_pay += '<div class="j-button-group" ><button class="j-button-confirm" id="buy" onclick="choosePayWay(\''+r.data.order_code+'\')">立即支付</button></div>'
 										$(".j-footer").append(go_pay)
 									}
 									$(".j-footer").append(html)
@@ -825,8 +825,8 @@
 			},1000)
 		}
 		//选择
-		function choosePayWay(order_code,filter_id){
-			window.location.href = "/jyapp/course/optionPay?code="+order_code+"&filter_id="+filter_id
+		function choosePayWay(order_code){
+			window.location.href = "/jyapp/pay/checkout_dataexport?orderCode="+order_code
 		}
 
 		//再次购买

+ 5 - 43
src/jfw/modules/app/src/web/templates/vipsubscribe/vip_purchase.html

@@ -796,12 +796,9 @@
                     $DoPost("/subscribepay/vipsubscribe/createOrder", param, function (r) {
                         if (r.success) {
                             try {
-                                if (param.payWay === "wx_app") {
-                                    JyObj.wxPay(r.data.res)
-                                } else {
-                                    JyObj.aliPay(r.data.res)
-                                }
-                                checkpay(r.data.code)
+                                clearSessionStorage()
+                                history.replaceState({}, '', '/jyapp/vipsubscribe/toOrderDetailPage?orderCode='+r.data.code);
+                                window.location.href="/jyapp/pay/checkout_vip?orderCode="+r.data.code
                             } catch (e) {
                                 showToast(e)
                             }
@@ -834,41 +831,6 @@
             }
 
 
-            //app支付 公共方法
-            //查询是否支付完成
-            var interval;
-
-            function checkpay(orderid) {
-                if (interval) {
-                    clearInterval(interval);
-                }
-                interval = setInterval(function () {
-                    $.post("/jypay/isPaySuccess", {code: orderid}, function (r) {
-                        if (r.success) {
-                            clearSessionStorage();
-                            window.location.replace("/jyapp/vipsubscribe/toPaySuccessPage?orderCode=" + orderid);
-                        }
-                    });
-                    if (canpay && mySysIsIos()) {
-                        clearInterval(interval);
-                    }
-                }, 2000)
-            }
-
-            function payCallBack(status) {
-                switch (status) {
-                    case "0"://支付取消
-                        clearInterval(interval);
-                        break;
-                    case "1"://支付完成
-
-                        break;
-                    case "-1"://支付失败
-                        clearInterval(interval);
-                        break;
-                }
-            }
-
             function showToast(content) {
                 weui.toast(content, {
                     duration: 2000,
@@ -947,7 +909,7 @@
             };
 
             // 活动事件绑定
-            var couponInfo = {
+            /*var couponInfo = {
                 code: 'jianyu360',
                 successTip: '支付成功赠送30天订阅周期'
             }
@@ -984,7 +946,7 @@
 						cancelButton.trigger('click')
                     }
                 })
-            })
+            })*/
         </script>
     </div>
 </div>

+ 2 - 14
src/jfw/modules/subscribepay/src/entity/dataReportStruct.go

@@ -18,17 +18,6 @@ import (
 type dataReportStruct struct{}
 
 var JyDataReportStruct dataReportStruct
-var DataReportSign map[string]string
-
-func init() {
-	DataReportSign = map[string]string{
-		"wx_app":  pay.WX_DATAREPORT_APP,
-		"wx_js":   pay.WX_DATAREPORT_JSAPI,
-		"wx_pc":   pay.WX_DATAREPORT_NATIVE,
-		"ali_app": pay.ALI_DATAREPORT_APP,
-		"ali_pc":  pay.ALI_DATAREPORT_NATIVE,
-	}
-}
 
 func (this *dataReportStruct) PayCallBack(param *CallBackParam) (update bool) {
 	orderdata := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
@@ -111,7 +100,7 @@ func (this *dataReportStruct) NewOrder(param frpc.JyPayOrderParam) (ordercode st
 
 //更新订单
 func (this *dataReportStruct) FlushOrder(param frpc.JyPayOrderChangeParam) (string, error) {
-	productSign, ok := DataReportSign[param.PayWay]
+	productSign, ok := pay.PayWayAndSign["datareport"][param.PayWay]
 	if !ok || productSign == "" {
 		return "", errors.New("未知支付类型")
 	}
@@ -178,8 +167,7 @@ func sendtemp(openid, order_coded, product_type, pay_time string) {
 			Service: order_coded,  //订单编号
 			Date:    pay_time,     //支付时间
 			Remark:  "数据报告将以电子版形式发送至您的邮箱,请注意垃圾邮件过滤,感谢您的光临",
-			Url:config.Config.WebDomain+"/datareport/page/order/detail/"+order_coded,
-
+			Url:     config.Config.WebDomain + "/datareport/page/order/detail/" + order_coded,
 		})
 		if !ok {
 			fmt.Println("数据报告", order_coded, ok, status)

+ 2 - 14
src/jfw/modules/subscribepay/src/entity/jyCourseOnlineStruct.go

@@ -19,18 +19,6 @@ type jyCourseOnline struct{}
 
 var JyCourseOnline jyCourseOnline
 
-var CourseProductSign map[string]string
-
-func init() {
-	CourseProductSign = map[string]string{
-		"wx_app":  pay.WX_COURSEONLINE_APP,
-		"wx_js":   pay.WX_COURSEONLINE_JSAPI,
-		"wx_pc":   pay.WX_COURSEONLINE_NATIVE,
-		"ali_app": pay.ALI_COURSEONLINE_APP,
-		"ali_pc":  pay.ALI_COURSEONLINE_NATIVE,
-	}
-}
-
 //支付完成回调
 func (this *jyCourseOnline) PayCallBack(param *CallBackParam) bool {
 	now := time.Now()
@@ -79,7 +67,7 @@ func (this *jyCourseOnline) PayCallBack(param *CallBackParam) bool {
 
 //生成订单
 func (this *jyCourseOnline) NewOrder(param frpc.JyPayOrderParam) (ordercode string, err error) {
-	productSign, ok := CourseProductSign[param.PayWay]
+	productSign, ok := pay.PayWayAndSign["onlineCourse"][param.PayWay]
 	if !ok || productSign == "" {
 		err = errors.New("未知支付类型")
 		return
@@ -124,7 +112,7 @@ func (this *jyCourseOnline) NewOrder(param frpc.JyPayOrderParam) (ordercode stri
 
 //更新订单
 func (this *jyCourseOnline) FlushOrder(param frpc.JyPayOrderChangeParam) (string, error) {
-	productSign, ok := CourseProductSign[param.PayWay]
+	productSign, ok := pay.PayWayAndSign["onlineCourse"][param.PayWay]
 	if !ok || productSign == "" {
 		return "", errors.New("未知支付类型")
 	}

+ 54 - 0
src/jfw/modules/subscribepay/src/pay/util.go

@@ -18,6 +18,60 @@ import (
 	"util"
 )
 
+/*vip订阅
+企业商机管理
+历史数据
+招投标课程
+数据报告
+线上课程*/
+
+var (
+	PayWayAndSign = map[string]map[string]string{
+		"vip": map[string]string{
+			"wx_js":   WX_SUBVIP_JSAPI,
+			"wx_app":  WX_SUBVIP_APP,
+			"wx_pc":   WX_SUBVIP_NATIVE,
+			"ali_app": ALI_SUBVIP_APP,
+			"ali_pc":  ALI_SUBVIP_NATIVE,
+		},
+		"entniche": map[string]string{
+			"wx_app":  WX_ENTNICHE_APP,
+			"wx_pc":   WX_ENTNICHE_NATIVE,
+			"ali_app": ALI_ENTNICHE_APP,
+			"ali_pc":  ALI_ENTNICHE_NATIVE,
+			//"wx_js":   "",
+		},
+		"dataexport": map[string]string{
+			"wx_js":   WX_DATAEXPORT_JSAPI,
+			"wx_app":  WX_DATAEXPORT_APP,
+			"wx_pc":   WX_DATAEXPORT_NATIVE,
+			"ali_app": ALI_DATAEXPORT_APP,
+			"ali_pc":  ALI_DATAEXPORT_NATIVE,
+		},
+		"course": map[string]string{
+			"wx_js":   WX_COURSE_JSAPI,
+			"wx_app":  WX_COURSE_APP,
+			"wx_pc":   WX_COURSE_NATIVE,
+			"ali_app": ALI_COURSE_APP,
+			"ali_pc":  ALI_COURSE_NATIVE,
+		},
+		"datareport": map[string]string{
+			"wx_js":   WX_DATAREPORT_JSAPI,
+			"wx_app":  WX_DATAREPORT_APP,
+			"wx_pc":   WX_DATAREPORT_NATIVE,
+			"ali_app": ALI_DATAREPORT_APP,
+			"ali_pc":  ALI_DATAREPORT_NATIVE,
+		},
+		"onlineCourse": map[string]string{
+			"wx_js":   WX_COURSEONLINE_JSAPI,
+			"wx_app":  WX_COURSEONLINE_APP,
+			"wx_pc":   WX_COURSEONLINE_NATIVE,
+			"ali_app": ALI_COURSEONLINE_APP,
+			"ali_pc":  ALI_COURSEONLINE_NATIVE,
+		},
+	}
+)
+
 /*
 公共创建订单
 price 价格

+ 108 - 78
src/jfw/modules/subscribepay/src/service/commonAction.go

@@ -6,6 +6,7 @@ import (
 	"encoding/json"
 	"entity"
 	"errors"
+	"fmt"
 	"log"
 	"net/rpc"
 	"pay"
@@ -24,16 +25,17 @@ import (
 //付费公用方法
 type CommonAction struct {
 	*xweb.Action
-	isPaySuccess  xweb.Mapper `xweb:"/isPaySuccess"`          //数据导出是否支付成功
+	isPaySuccess  xweb.Mapper `xweb:"/isPaySuccess"`          //是否支付成功
 	paySuccess    xweb.Mapper `xweb:"/dataReport/paySuccess"` //数据报告支付完成
 	deleteOrder   xweb.Mapper `xweb:"/deleteOrder"`           //删除订单
 	vipPaySuccess xweb.Mapper `xweb:"/vipPaySuccess"`         //数据导出是否支付成功
+	applyInvoice  xweb.Mapper `xweb:"/applyInvoice"`          //申请发票
 
-	applyInvoice    xweb.Mapper `xweb:"/applyInvoice"`       //申请发票
-	getwxSdkSign    xweb.Mapper `xweb:"/wx/getwxSdkSign"`    //微信js参数
-	getWxjsPayParam xweb.Mapper `xweb:"/wx/getWxjsPayParam"` //获取微信支付参数
-	getPcPayCode    xweb.Mapper `xweb:"/pc/getPayCode"`      //获取扫码支付参数
-
+	//公共支付方法
+	getwxSdkSign        xweb.Mapper `xweb:"/wx/getwxSdkSign"`      //微信js参数
+	getPcPayCode        xweb.Mapper `xweb:"/pc/getPayCode"`        //获取扫码支付参数
+	getCommonOrderPrice xweb.Mapper `xweb:"/common/getOrderPrice"` //获取扫码支付参数
+	getCommonPayParam   xweb.Mapper `xweb:"/common/getPayParam"`   //公共获取支付方法
 }
 
 //----------------------------申请发票------------------------------------
@@ -257,78 +259,6 @@ func SignJSSDK(url string) []string {
 	return signature
 }
 
-func (this *CommonAction) GetWxjsPayParam() {
-	orderCode := this.GetString("orderCode")
-	userId := qutil.ObjToString(this.GetSession("userId"))
-	r := func() *entity.FuncResult {
-		//根据订单号获取订单数据
-		query := map[string]interface{}{
-			"user_id":      userId,
-			"order_code":   orderCode,
-			"order_status": 0,
-		}
-		oData := util.Mysql.FindOne("dataexport_order", query, "id,code_url,prepay_time,pay_way,order_money", "")
-		if oData == nil || len(*oData) == 0 {
-			return &entity.FuncResult{false, errors.New("未知订单"), nil}
-		}
-		//判断订单是否超过两小时
-		prepayTime, _ := time.ParseInLocation(qutil.Date_Full_Layout, qutil.ObjToString((*oData)["prepay_time"]), time.Local)
-		jsPayParam := qutil.ObjToString((*oData)["code_url"])
-		payway := qutil.ObjToString((*oData)["pay_way"])
-		totalfee := qutil.IntAll((*oData)["order_money"])
-		if time.Now().Before(prepayTime.Add(time.Hour*2)) && jsPayParam != "" && payway == "wx_js" {
-			//未过期
-			return &entity.FuncResult{true, nil, map[string]interface{}{"orderCode": orderCode, "res": jsPayParam, "price": totalfee}}
-		}
-		//重新生成订单
-		tradeno, prepayid := "", ""
-		dotype := this.GetString("dotype")
-		productFlag := ""
-		if dotype == "vip" {
-			productFlag = pay.WX_SUBVIP_JSAPI
-		} else if dotype == "dataexport" {
-			productFlag = pay.WX_DATAEXPORT_JSAPI
-		} else if dotype == "onlineCourse" {
-			productFlag = pay.WX_COURSEONLINE_JSAPI
-		} else if dotype == "datareport" {
-			productFlag = pay.WX_DATAREPORT_JSAPI
-		} else {
-			return &entity.FuncResult{false, errors.New("未知订单类型"), nil}
-		}
-		var ret *map[string]string
-		tradeno, ret = pay.WxStruct.CreatePrepayOrder(productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), "", totalfee)
-		if ret == nil || (*ret)["status"] != "1" {
-			errMsg := "创建微信订单出错"
-			if (*ret)["errcodedes"] != "" {
-				errMsg = (*ret)["errcodedes"]
-			} else if (*ret)["errcode"] != "" {
-				errMsg = (*ret)["errcode"]
-			}
-			return &entity.FuncResult{false, errors.New(errMsg), nil}
-		}
-		prepayid = qutil.ObjToString((*ret)["prepayid"])
-		jsPayParam = pay.GetWxJsPayStr(prepayid)
-
-		//更新订单表
-		now := time.Now()
-		ok := util.Mysql.Update("dataexport_order", query, map[string]interface{}{
-			"code_url":     jsPayParam,
-			"prepay_time":  qutil.FormatDate(&now, qutil.Date_Full_Layout),
-			"out_trade_no": tradeno,
-			"prepay_id":    prepayid,
-			"pay_way":      "wx_js",
-		})
-		if !ok {
-			return &entity.FuncResult{false, errors.New("数据库操作异常"), nil}
-		}
-		return &entity.FuncResult{true, nil, map[string]interface{}{"orderCode": orderCode, "res": jsPayParam, "price": totalfee}}
-	}()
-	if r.Err != nil {
-		log.Printf("%s CreateOrder err:%v\n", userId, r.Err.Error())
-	}
-	this.ServeJson(r.Format())
-}
-
 //扫码支付公共接口
 func (this *CommonAction) GetPcPayCode() {
 	orderCode := this.GetString("orderCode")
@@ -372,6 +302,7 @@ func (this *CommonAction) GetPcPayCode() {
 			}
 		}
 		//重新生成订单
+		//productSign, ok := pay.PayWayAndSign["onlineCourse"][param.PayWay]
 		dotype := qutil.ObjToString((*oData)["product_type"])
 		productFlag := ""
 		if dotype == "企业商机管理" {
@@ -414,3 +345,102 @@ func (this *CommonAction) GetPcPayCode() {
 	}
 	this.ServeJson(r.Format())
 }
+
+/*
+支付页面获取订单价格
+param
+orderCode 订单号
+*/
+func (this *CommonAction) GetCommonOrderPrice() {
+	orderCode := this.GetString("orderCode")
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	r := func() *entity.FuncResult {
+		query := map[string]interface{}{
+			"user_id":    userId,
+			"order_code": orderCode,
+		}
+		oData := util.Mysql.FindOne("dataexport_order", query, "order_money", "")
+		if oData == nil || len(*oData) == 0 {
+			return &entity.FuncResult{false, errors.New("未知订单"), nil}
+		}
+		return &entity.FuncResult{true, nil, map[string]interface{}{
+			"price": (*oData)["order_money"],
+		}}
+	}()
+	if r.Err != nil {
+		log.Printf("%s GetCommonOrderPrice err:%v\n", userId, r.Err.Error())
+	}
+	this.ServeJson(r.Format())
+}
+
+/*
+支付页面获取支付参数
+param
+orderCode 订单号
+payway 支付方式
+dotype 产品类型
+*/
+func (this *CommonAction) GetCommonPayParam() {
+	orderCode := this.GetString("orderCode")
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	payway_req := this.GetString("payway")
+	r := func() *entity.FuncResult {
+		query := map[string]interface{}{
+			"user_id":      userId,
+			"order_code":   orderCode,
+			"order_status": 0,
+		}
+		oData := util.Mysql.FindOne("dataexport_order", query, "id,code_url,prepay_time,pay_way,order_money", "")
+		if oData == nil || len(*oData) == 0 {
+			return &entity.FuncResult{false, errors.New("未知订单"), nil}
+		}
+		//上次订单支付串是否可用
+		prepayTime, _ := time.ParseInLocation(qutil.Date_Full_Layout, qutil.ObjToString((*oData)["prepay_time"]), time.Local)
+		payParam := qutil.ObjToString((*oData)["code_url"])
+		payway := qutil.ObjToString((*oData)["pay_way"])
+		totalfee := qutil.IntAll((*oData)["order_money"])
+		if time.Now().Before(prepayTime.Add(time.Hour*2)) && payParam != "" && payway == payway_req { //支付串未过期
+			return &entity.FuncResult{true, nil, map[string]interface{}{
+				"orderCode": orderCode,
+				"res":       payParam,
+				"price":     totalfee,
+				"payWay":    payway}}
+		}
+		//重新生成订单
+		dotype := this.GetString("dotype")
+		productFlag, ok := pay.PayWayAndSign[dotype][payway_req]
+		if !ok {
+			return &entity.FuncResult{false, errors.New("未知支付类型"), nil}
+		}
+		tradeno, prepayid, payParam, err := pay.CreateOrderPay(totalfee, productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), payway_req)
+		if err != nil {
+			return &entity.FuncResult{false, errors.New(fmt.Sprintf("创建支付失败[%v]", err)), nil}
+		}
+		//更新订单表
+		now := time.Now()
+		ok = util.Mysql.Update("dataexport_order", query, map[string]interface{}{
+			"code_url":     payParam,
+			"prepay_time":  qutil.FormatDate(&now, qutil.Date_Full_Layout),
+			"out_trade_no": tradeno,
+			"prepay_id":    prepayid,
+			"pay_way":      payway_req,
+		})
+		if !ok {
+			return &entity.FuncResult{false, errors.New("数据库操作异常"), nil}
+		}
+		return &entity.FuncResult{true, nil, map[string]interface{}{
+			"orderCode": orderCode,
+			"res":       payParam,
+			"price":     totalfee,
+			"payWay":    payway}}
+	}()
+	if r.Err != nil {
+		log.Printf("%s GetCommonPayParam err:%v\n", userId, r.Err.Error())
+	}
+	if payway_req == "wx_pc" && r.Data["res"] != nil {
+		rEncode, _ := qr.Encode(qutil.ObjToString(r.Data["res"]), qr.M)
+		pngdat := rEncode.PNG()
+		r.Data["res"] = base64.StdEncoding.EncodeToString(pngdat)
+	}
+	this.ServeJson(r.Format())
+}

+ 0 - 18
src/jfw/modules/subscribepay/src/service/vipSubscribePay.go

@@ -44,7 +44,6 @@ func (this *SubVipPayOrder) CreateOrder() {
 	orderType, _ := this.GetInteger("orderType") //1 简单付费,5 升降级续费
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	openId := qutil.ObjToString(this.GetSession("s_m_openid"))
-	activeCode := this.GetString("activeCode") //优惠码
 	r := func() *entity.FuncResult {
 		now := time.Now()
 		//数据校验
@@ -169,9 +168,6 @@ func (this *SubVipPayOrder) CreateOrder() {
 			timeStamp := qutil.Int64All((*userData)["l_vip_endtime"])
 			startTime := time.Unix(timeStamp, 0)
 			endTime := util.GetDATE(filter.Cycleunit, filter.Cyclecount, timeStamp)
-			if activeCode == "jianyu360" {
-				endTime = endTime.AddDate(0, 0, 30)
-			}
 			insertMap["vip_type"] = 1
 			insertMap["vip_starttime"] = qutil.FormatDate(&startTime, qutil.Date_Full_Layout)
 			insertMap["vip_endtime"] = qutil.FormatDate(&endTime, qutil.Date_Full_Layout)
@@ -180,20 +176,6 @@ func (this *SubVipPayOrder) CreateOrder() {
 		if orderid == -1 {
 			return &entity.FuncResult{false, errors.New("数据库操作异常"), nil}
 		}
-		//优惠码
-		if activeCode == "jianyu360" {
-			activeInsertMap := map[string]interface{}{
-				"order_code":  ordercode,
-				"create_time": qutil.FormatDate(&now, qutil.Date_Full_Layout),
-				"active_type": "VIP订阅",
-				"user_id":     userId,
-				"active_code": activeCode,
-			}
-			activeOrderId := util.Mysql.Insert("prefer_active", activeInsertMap)
-			if activeOrderId == -1 {
-				return &entity.FuncResult{false, errors.New("优惠码存库异常"), nil}
-			}
-		}
 		//支付提醒
 		if nowTime >= liveActiveStartTime && nowTime < liveActiveEndTime {
 			util.ActiveMsgRemind.Add(qutil.IntAll(orderid), totalfee, qutil.If(orderType == 5, 1, -1).(int), 0, ordercode, userId, now.Unix())

+ 2 - 1
src/web/templates/weixin/commonPay/checkout.html

@@ -140,11 +140,12 @@
                     content: '加载中...',
                 })
                 $.ajax({
-                    url: '/jypay/wx/getWxjsPayParam',
+                    url: '/jypay/common/getPayParam',
                     type: 'POST',
                     data: {
                         orderCode: this.orderInfo.ordercode,
                         dotype: this.orderInfo.productType,
+                        payway:"wx_js",
                     },
                     contentType: 'application/x-www-form-urlencoded',
                     success: function (res) {

+ 1 - 1
src/web/templates/weixin/commonPay/paySuccess.html

@@ -36,7 +36,7 @@
     </div>
     {{if eq .T.doType "vip"}}
     <div class="bottom_button j-button-group" id="vip">
-        <button class="left_btn j-button-cancel1" onclick="window.location.href = '/front/vipsubscribe/toOrderDetailPage?orderCode=' + orderCode">查看订单</button>
+        <button class="left_btn j-button-cancel1" onclick="window.location.href = '/front/vipsubscribe/toOrderDetailPage?orderCode=' + {{.T.orderCode}}">查看订单</button>
         <button class="right_btn j-button-confirm1" onclick="window.location.href = '/front/vipsubscribe/toSubVipSetPage'">VIP设置</button>
     </div>
     {{end}}

+ 1 - 1
src/web/templates/weixin/dataExport/dataExport_toMyOrder.html

@@ -133,7 +133,7 @@
             return
         }
         canpay = false;
-        $.post("/jypay/wx/getWxjsPayParam", {"orderCode": ordercode,"dotype":dotype}, function (res) {
+        $.post("/jypay/common/getPayParam", {"orderCode": ordercode,"dotype":dotype,"payway":"wx_js"}, function (res) {
             gopayIndex = $(e).parent().parent().index();
             if (res.success) {
               res.data["orderCode"]=ordercode;

部分文件因为文件数量过多而无法显示