Pay.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <template id='Pay'>
  2. <div>
  3. <van-nav-bar title="电量充值" left-arrow @click-left="back">
  4. <span @click="go" class="iconfont" slot="right">&#xe646;</span>
  5. </van-nav-bar>
  6. <div class="fyycontent fyypay">
  7. <van-cell-group>
  8. <van-cell>
  9. <span class="iconfont color-red fyy-icon">&#xe640;</span>
  10. <span v-html="area.name"></span>
  11. <span class="m-left10" v-html="building.name"></span>
  12. <span class="m-left10" v-html="room.name">601</span>
  13. </van-cell>
  14. <div class="fyyinput">
  15. <input type="number" placeholder="请输入要充值的电量度数" v-model="kwh"/>
  16. <span class="input-right">度</span>
  17. </div>
  18. <p class="fyy-h6">价格标准:<span v-html="price"></span>元/度</p>
  19. </van-cell-group>
  20. <van-cell-group>
  21. <van-cell>
  22. <span class="iconfont color-red fyy-icon">&#xe648;</span>
  23. 选择支付方式
  24. </van-cell>
  25. <van-radio-group v-model="payType" class="fyyradio-pay">
  26. <van-cell-group>
  27. <van-cell clickable @click="payType = 'weipay'">
  28. <img src="@/assets/img/weixin.png" />
  29. <van-radio slot="right-icon" name='weipay'/>
  30. </van-cell>
  31. <van-cell clickable @click="payType = 'alipay'">
  32. <img src="@/assets/img/zhifubao.png" />
  33. <van-radio slot="right-icon" name='alipay'/>
  34. </van-cell>
  35. </van-cell-group>
  36. </van-radio-group>
  37. </van-cell-group>
  38. </div>
  39. <div class="fyyfooter">
  40. <p class="fyy-h5">
  41. 核计:
  42. <span class="fyy-h3 color-red" v-html="total"></span>元
  43. </p>
  44. <router-link to="/Pay">
  45. <van-button type="bigred" @click="pay" :loading="paying">支付</van-button>
  46. </router-link>
  47. </div>
  48. <van-dialog
  49. v-model="showAlipay"
  50. title="支付宝扫码支付"
  51. overlay
  52. confirm = "paying = false"
  53. >
  54. <div ref="qrcodeDiv" class="qrcode"></div>
  55. </van-dialog>
  56. </div>
  57. </template>
  58. <script>
  59. import remoteApi from '@/api/remoteApi'
  60. import QRCode from 'qrcodejs2'
  61. import Cookies from 'js-cookie'
  62. export default {
  63. data() {
  64. return {
  65. paying: false,
  66. area:{},
  67. building:{},
  68. room:{},
  69. price:0,
  70. roomId : null,
  71. kwh : 0,
  72. payType: 'weipay',
  73. showAlipay: false,
  74. qrCodeUrl: ''
  75. }
  76. },
  77. methods: {
  78. go() {
  79. this.$router.push("/Paylist")
  80. },
  81. back() {
  82. this.$router.push("/")
  83. },
  84. pay() {
  85. var self = this
  86. self.paying = true
  87. self.$toast.loading({
  88. message: '处理中...',
  89. forbidClick: true,
  90. loadingType: 'spinner',
  91. duration: 10000
  92. });
  93. if(self.payType=='weipay'){
  94. //首先要获取openid
  95. remoteApi.prepareWXPay(self.roomId,self.payType,self.kwh,self.total).then(resp=>{
  96. self.$toast.clear()
  97. if(resp.result) {
  98. var appId = resp.data.appId
  99. var redirectUri = encodeURIComponent(window.location.href.split('#')[0] + '#WXPay')
  100. var state = resp.data.recordId
  101. var url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_userinfo&state=${state}#wechat_redirect`
  102. window.location.href = url
  103. }
  104. else{
  105. self.paying = false
  106. self.$toast.fail(resp.message)
  107. }
  108. });
  109. }
  110. else if(self.payType=='alipay') {
  111. remoteApi.prepareAliPay(self.roomId,self.payType,self.kwh,self.total).then(resp=>{
  112. if(resp.result){
  113. var recordId = resp.data.recordId;
  114. return remoteApi.tradePrecreatePay(recordId);
  115. }
  116. else{
  117. self.paying = false
  118. self.$toast.fail(resp.message)
  119. }
  120. }).then(resp=>{
  121. self.$toast.clear()
  122. if(resp==null){
  123. return;
  124. }
  125. console.log(resp);
  126. if(resp.result) {
  127. self.showAlipay = true;
  128. //对话框显示后才能正常获取到$refs.qrcodeDiv
  129. self.$nextTick(()=>{
  130. var qrcode = new QRCode(self.$refs.qrcodeDiv, {
  131. text: resp.data,
  132. width: 200,
  133. height: 200,
  134. colorDark: '#000000',
  135. colorLight: '#ffffff',
  136. correctLevel: QRCode.CorrectLevel.H
  137. })
  138. })
  139. }
  140. else{
  141. self.paying = false
  142. self.$toast.fail(resp.message)
  143. }
  144. });
  145. }
  146. }
  147. },
  148. computed: {
  149. total (){
  150. return (this.kwh * this.price).toFixed(2);
  151. }
  152. },
  153. mounted () {
  154. // 当前页面是否获取到了openid?
  155. this.roomId = this.$route.query.roomId;
  156. if(this.roomId==null || this.roomId.length==0){
  157. this.roomId = Cookies.get("selectedRoomId");
  158. }
  159. this.$toast.loading({
  160. message: '加载中...',
  161. forbidClick: true,
  162. loadingType: 'spinner',
  163. duration: 10000
  164. });
  165. var self = this;
  166. remoteApi.queryRoomDetail(this.roomId).then((resp)=>{
  167. console.log(resp);
  168. this.$toast.clear();
  169. if(resp.result){
  170. //self.$toast.success('查询成功!')
  171. var jsonData = resp.data
  172. self.area = jsonData.area
  173. self.building = jsonData.building
  174. self.room = jsonData.room
  175. self.price = parseFloat(jsonData.price)
  176. }
  177. else {
  178. self.$toast.fail(resp.message)
  179. }
  180. });
  181. }
  182. }
  183. </script>
  184. <style lang="scss" scoped>
  185. </style>