index.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <template>
  2. <div class="submit-layout">
  3. <form id="formid" class="form-con" :action="`${$serverName}api/order/pay/paypalH5`" method="post">
  4. <input v-model="orderId" type="text" name='orderId'>
  5. <input v-model="orderType" type="text" name='orderType'>
  6. <input type="submit" value="提交">
  7. </form>
  8. <div class="time-line">
  9. <div class="line"></div>
  10. <div class="auth">
  11. <img :src="`${$cdn}images/hasLogin.png`" alt="" class="timeline-icon">
  12. <div class="timeline-text">登录信息</div>
  13. </div>
  14. <div class="shipping">
  15. <img :src="`${$cdn}images/hasLogin.png`" alt="" class="timeline-icon">
  16. <div class="timeline-text">配送信息</div>
  17. </div>
  18. <div class="payment">
  19. <img :src="`${$cdn}images/hasLogin.png`" alt="" class="timeline-icon">
  20. <div class="timeline-text">支付信息</div>
  21. </div>
  22. <div class="review">
  23. <img :src="`${$cdn}images/spot.png`" alt="" class="timeline-icon">
  24. <div class="timeline-text">订单提交</div>
  25. </div>
  26. </div>
  27. <div class="box-con">
  28. <div class="bc-title">收货信息</div>
  29. <div class="bc-item">
  30. <div class="bc-ct">
  31. <div class="bc-contact">
  32. {{payinfo.receiver.shipName}}
  33. <div>{{payinfo.receiver.shipMobile}}</div>
  34. </div>
  35. <div class="bc-locotion">
  36. {{payinfo.receiver.shipAreaPath}}{{payinfo.receiver.shipAddress}}
  37. </div>
  38. </div>
  39. <div class="bc-express">顺丰速运</div>
  40. </div>
  41. </div>
  42. <div class="box-con">
  43. <div class="bc-title">
  44. <span>支付信息</span>
  45. <span @click="$router.back()">修改</span>
  46. </div>
  47. <div class="bc-item pay-item">
  48. <div class="item-method">{{payinfo.payTypeName}}</div>
  49. <div class="item-time">提交订单后,请您在新打开的页面完成支付</div>
  50. </div>
  51. </div>
  52. <div class="box-con">
  53. <div class="bc-title">订单概览</div>
  54. <div class="confirm-products">
  55. <div class="confirm-products-item" v-for="(item,i) in payinfo.goods" :key="i">
  56. <div class="product-thumb">
  57. <img :src="item.goodsId===4?`${$cdn}images/banner_pro.png`:`${$cdn}images/t_product.png`" alt="">
  58. </div>
  59. <div class="product-info">
  60. <div class="product-name">
  61. <img class="img-txt" :src="item.goodsId===4?`${$cdn}images/download-pro.png`:`${$cdn}images/download-lite.png`" alt="">
  62. </div>
  63. <div class="product-name">标准套餐</div>
  64. <div class="product-count">
  65. <span class="product-price">CNY ¥{{item.price}} x {{item.goodsCount}}</span>
  66. <span class="product-sum">CNY ¥{{item.price}}</span>
  67. </div>
  68. </div>
  69. </div>
  70. <div class="cart-table-count">
  71. <div class="cart-table-count-item">
  72. <span class="title">商品总价:</span>
  73. <span class="price">CNY ¥{{getSum()[1]}}</span>
  74. </div>
  75. <div class="cart-table-count-item">
  76. <span class="title">税费及其他费用:</span>
  77. <span class="price">
  78. <span class="free-shipping">
  79. <img :src="`${$cdn}images/free@2x.png`" alt="" class="free-shipping-img">
  80. <span class="free-shipping-text">包含</span>
  81. </span>
  82. </span>
  83. </div>
  84. <div class="cart-table-count-item">
  85. <span class="title">运费:</span>
  86. <span class="price">
  87. <span class="free-shipping">
  88. <img :src="`${$cdn}images/free@2x.png`" alt="" class="free-shipping-img">
  89. <span class="free-shipping-text">免费</span>
  90. </span>
  91. </span>
  92. </div>
  93. <div class="cart-table-total cart-table-count-item">
  94. <span class="total-title">合计:</span>
  95. <span class="total-price">CNY ¥{{getSum()[1]}}</span>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <div class="btn-submit" @click="pay">提交订单</div>
  101. </div>
  102. </template>
  103. <script>
  104. import { mapState } from 'vuex'
  105. import browser from '@/util/browser'
  106. var cloneObj = function (obj) {
  107. var newObj = {}
  108. if (obj instanceof Array) {
  109. newObj = []
  110. }
  111. for (var key in obj) {
  112. var val = obj[key] || ''
  113. newObj[key] = typeof val === 'object' ? cloneObj(val) : val
  114. }
  115. return newObj
  116. }
  117. let paytypes = {
  118. 0: 'wechatMobilePay',
  119. 1: 'aliMobilePay'
  120. }
  121. export default {
  122. computed: {
  123. ...mapState({
  124. token: state => state.user.token || '',
  125. language: state => state.language.current,
  126. payinfo: state => {
  127. let type = Object.prototype.toString.call(state.user.payinfo)
  128. if (type === '[object Object]') {
  129. return state.user.payinfo
  130. }
  131. let condition = state.user.payinfo && state.user.payinfo !== 'null' && type !== '[object Array]'
  132. return condition ? JSON.parse(state.user.payinfo) : {}
  133. }
  134. })
  135. },
  136. data () {
  137. return {
  138. selected: false,
  139. isWeixin: browser.weixin,
  140. orderId: '',
  141. orderType: 0
  142. }
  143. },
  144. methods: {
  145. async pay () {
  146. let {invoice, goods, payType, receiver} = this.payinfo
  147. let params = {
  148. goods,
  149. receiver,
  150. invoice,
  151. payType,
  152. abroad: this.language === 'en' ? 1 : 0
  153. }
  154. let res = await this.$http
  155. .post('user/order/placeOrder', params, {
  156. headers: {
  157. token: this.token
  158. }
  159. })
  160. this.$store.commit('ORDERINFO', {
  161. orderSn: res.data.data.orderSn,
  162. price: res.data.data.goodsAmount
  163. })
  164. this.$store.dispatch('getCart')
  165. let data = {
  166. orderId: res.data.data.id,
  167. orderType: 0
  168. }
  169. this.orderId = res.data.data.id
  170. this.orderType = 0
  171. if (Number(payType) !== 2) {
  172. if (this.isWeixin) {
  173. return location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri=http%3a%2f%2fpro.4dkankan.com%2fapi%2forder%2fpay%2fwechatPreJsPay%3forderId=${this.orderId}&appid=wx779dbafb46bab697&response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect`)
  174. }
  175. let response = await this.$http
  176. .post(`order/pay/${paytypes[payType]}`, data, {
  177. headers: {
  178. token: this.token
  179. }
  180. })
  181. let url = payType === 1 ? response.data.data.form : response.data.data.mweb_url
  182. location.replace(url)
  183. } else {
  184. document.getElementById('formid').submit()
  185. this.$toast.show('warn', '正在跳转至paypal支付链接,请稍等')
  186. }
  187. },
  188. getSum () {
  189. let sum = 0
  190. let count = 0
  191. this.payinfo.goods.forEach(item => {
  192. sum += item.goodsCount * item.price
  193. count += item.goodsCount
  194. })
  195. return [count, sum]
  196. }
  197. }
  198. }
  199. </script>
  200. <style lang="scss" scoped>
  201. @import './style.scss';
  202. </style>