index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <template>
  2. <view>
  3. <u-navbar :is-back="false" title=" " :border-bottom="false">
  4. <view class="u-flex u-row-right" style="width: 100%;">
  5. <view class="camera u-flex u-row-center">
  6. <u-icon name="camera-fill" color="#000000" size="48"></u-icon>
  7. </view>
  8. </view>
  9. </u-navbar>
  10. <vue-qrcode v-if="qrcontent" :value='qrcontent' :options="{ width: 200 }"></vue-qrcode>
  11. <view class="u-flex user-box u-p-l-30 u-p-r-20 u-p-b-30">
  12. <view class="u-m-r-10" @click="login($store.state.vuex_hasLogin)">
  13. <u-avatar :src="userInfo.imgUrl||pic" size="140"></u-avatar>
  14. </view>
  15. <view class="u-flex-1" @click="login($store.state.vuex_hasLogin)">
  16. <view class="u-font-18 u-p-b-20">{{ userInfo.nickname || '请登录' }}</view>
  17. <view class="u-font-14 u-tips-color">手机号:{{ userInfo.tel || '暂无' }}</view>
  18. </view>
  19. <view class="u-m-l-10 u-p-10">
  20. <u-icon name="scan" color="#969799" size="28"></u-icon>
  21. </view>
  22. <view class="u-m-l-10 u-p-10">
  23. <u-icon name="arrow-right" color="#969799" size="28"></u-icon>
  24. </view>
  25. </view>
  26. <view class="u-m-t-20">
  27. <u-cell-group>
  28. <u-cell-item icon="rmb-circle" title="微信支付" v-if="userAgent!='aliAgent'" @click="submitOrder()"></u-cell-item>
  29. <u-cell-item icon="rmb-circle" title="微信退款" v-if="userAgent!='aliAgent'" @click="refund()"></u-cell-item>
  30. <u-cell-item icon="rmb-circle" title="支付宝支付" v-if="userAgent!='wxAgent'" @click="handleAliPay()"></u-cell-item>
  31. <u-cell-item icon="rmb-circle" title="支付宝支付退款" v-if="userAgent!='wxAgent'" @click="handleAliRefund()"></u-cell-item>
  32. <!-- <u-cell-item icon="rmb-circle" title="支付宝gotoPayPage" v-if="userAgent!='wxAgent'" @click="handleAliPayPage()"></u-cell-item> -->
  33. <u-cell-item icon="rmb-circle" title="支付宝生成收款码" v-if="userAgent!='wxAgent'" @click="handleAligetPayimg()"></u-cell-item>
  34. <u-cell-item icon="rmb-circle" title="支付宝条码支付" v-if="userAgent!='wxAgent'" @click="handleShowScanner()"></u-cell-item>
  35. </u-cell-group>
  36. </view>
  37. <view class="u-m-t-20">
  38. <u-cell-group>
  39. <u-cell-item icon="star" title="收藏"></u-cell-item>
  40. <u-cell-item icon="photo" title="相册"></u-cell-item>
  41. <u-cell-item icon="coupon" title="卡券"></u-cell-item>
  42. <u-cell-item icon="heart" title="关注"></u-cell-item>
  43. </u-cell-group>
  44. </view>
  45. <view class="u-m-t-20">
  46. <u-cell-group>
  47. <!-- <u-cell-item icon="setting" title="设置"></u-cell-item> -->
  48. <u-cell-item icon="setting" :title="vuex_user.tel?'更换手机号':'绑定手机号'" @click="openPage('/pages/template/bindPhoneNumber/bindPhoneNumber')"></u-cell-item>
  49. <u-cell-item icon="lock-opened-fill" title="退出" v-if="vuex_hasLogin" @click="logout"></u-cell-item>
  50. </u-cell-group>
  51. </view>
  52. <!-- 获取扫描信息 -->
  53. <view class="scanner" v-if="showScanner" @click.self="handleCloseScanner"><!-- @click="handleCloseScanner" -->
  54. <!-- <u-input v-model="scannerText" type="text" :focus="true" :border="true" @change="scannerChange" /> -->
  55. <u-field v-model="scannerText" :focus="true" label-width="0" label="" placeholder="请使用扫描枪扫码" confirm="scannerChange">
  56. </u-field>
  57. <u-button type="primary" @click="handleBarcode">确定</u-button>
  58. </view>
  59. <u-toast ref="uToast" />
  60. </view>
  61. </template>
  62. <script>
  63. import VueQrcode from '@chenfengyuan/vue-qrcode'
  64. export default {
  65. components:{
  66. VueQrcode
  67. },
  68. data() {
  69. return {
  70. pic:'https://uviewui.com/common/logo.png',
  71. show:true,
  72. userInfo:[],
  73. requested:true,
  74. userAgent:null,
  75. //二维码内容
  76. qrcontent:null,
  77. // 扫描枪内容
  78. scannerText:null,
  79. showScanner:false,
  80. }
  81. },
  82. onLoad() {
  83. if(this.$store.state.vuex_hasLogin){
  84. this.userInfo = this.$store.state.vuex_user;
  85. }else{
  86. this.userInfo = [];
  87. };
  88. //判断客户端类别
  89. if (/MicroMessenger/.test(window.navigator.userAgent)) {
  90. this.userAgent = "wxAgent";
  91. // console.log('handleAliPay 微信客户端');
  92. } else if (/AlipayClient/.test(window.navigator.userAgent)) {
  93. this.userAgent = "aliAgent";
  94. // console.log('handleAliPay 支付宝客户端');
  95. } else {
  96. this.userAgent = "otherAgent";
  97. // console.log('handleAliPay 其他浏览器');
  98. };
  99. },
  100. methods: {
  101. openPage(path) {
  102. console.log('path',path);
  103. this.$u.route({
  104. url: path
  105. })
  106. },
  107. showToast() {
  108. this.$refs.uToast.show({
  109. title: this.message || "请设置提示语",
  110. type: this.messageType||"success",
  111. icon:false,
  112. // url: '/pages/user/index'
  113. })
  114. },
  115. //登录判断
  116. login(status){
  117. if(!status){
  118. console.log('config',this.config);
  119. window.location.replace(this.config.loginUrl)
  120. }
  121. },
  122. //提交校验
  123. submitOrder:function(){
  124. if(!this.vuex_hasLogin){
  125. this.message = "请先登录"
  126. this.showToast();
  127. return;
  128. }
  129. if(this.requested){
  130. this.requested = false;
  131. uni.showLoading({
  132. title: '订单生成中。'
  133. });
  134. // if(this.cartList.length == 0){
  135. // this.$api.msg("请先选择产品!")
  136. // return;
  137. // }else{
  138. // let userInfo = uni.getStorageSync("userInfo");
  139. // console.log( uni.getStorageSync("linkType") );
  140. let params = {
  141. // customerId:userInfo.guid,
  142. // list:this.cartList,
  143. // linkType: uni.getStorageSync("linkType") || '',
  144. // activityId:uni.getStorageSync("togetherId") || ''
  145. }
  146. this.syncData(params);
  147. // }
  148. }else{
  149. // this.showToast();
  150. setTimeout(()=>{
  151. uni.showLoading({
  152. title: '订单生成中。'
  153. });
  154. },2000);
  155. return
  156. };
  157. },
  158. //订单提交,拿到订单id
  159. syncData(data){
  160. this.$u.api.createOrder(data)
  161. .then(res=>{
  162. this.requested = true;
  163. console.log('res',res);
  164. if(res.retHead.errCode == 0){
  165. // this.pullWeichatPay(res.retBody)
  166. this.pullWeichatPay(res.retBody.orderId)
  167. uni.setStorage({
  168. key:'wxTradeNo',
  169. data:res.retBody.orderId
  170. });
  171. }else{
  172. this.message = res.retHead.errMsg;
  173. this.showToast();
  174. }
  175. uni.hideLoading()
  176. }).catch(err=>{console.log('createOrder err',err)})
  177. },
  178. //拉起微信支付
  179. async pullWeichatPay(id){
  180. let params = {
  181. orderId:id,
  182. openid:this.$store.state.vuex_user.openId,
  183. tradeType:"test"
  184. }
  185. this.$pay.wxPay(params).then(res =>{
  186. if(res.code == 0){
  187. uni.reLaunch({
  188. url: '/pages/buySuccess/buySuccess?orderId=' + params.orderId
  189. })
  190. }else if(res.code == 1){
  191. uni.redirectTo({
  192. url: '/pages/userCenter/myOrder/myOrder'
  193. })
  194. }else if(res.code == 2){
  195. this.message = "支付失败,请检查!"
  196. this.showToast();
  197. setTimeout(()=>{
  198. uni.redirectTo({
  199. url: '/pages/userCenter/myOrder/myOrder'
  200. });
  201. },1000)
  202. }
  203. })
  204. },
  205. //退出
  206. logout(){
  207. this.$u.vuex('vuex_hasLogin', false);
  208. this.$router.go(0);
  209. },
  210. //退款
  211. refund(){
  212. let orderId = null;
  213. try {
  214. orderId = uni.getStorageSync('wxTradeNo');
  215. if (orderId) {
  216. console.log(orderId);
  217. }
  218. } catch (e) {
  219. console.log('handleAliRefund e',e)
  220. // error
  221. };
  222. this.$u.api.refund({orderId:orderId,refundDesc:'测试'})
  223. .then(res =>{
  224. this.message = res.retHead.errMsg;
  225. this.showToast();
  226. console.log('refund res',res)
  227. }).catch(err=>{
  228. this.message = err.retHead.errMsg;
  229. this.showToast();
  230. console.log('refund err',err)
  231. })
  232. },
  233. //支付宝支付
  234. handleAliPay(){
  235. let tradeNo = new Date().getTime();
  236. uni.setStorage({
  237. key:'aliTradeNo',
  238. data:tradeNo
  239. });
  240. this.$u.api.alipage({outTradeNo:tradeNo})
  241. .then(res=>{
  242. let divForm = document.getElementsByTagName('divform')
  243. if (divForm.length) {
  244. document.body.removeChild(divForm[0])
  245. }
  246. const div = document.createElement('divform')
  247. div.innerHTML = res.retBody // res.data就是sb支付宝返回给你的form
  248. document.body.appendChild(div);
  249. // document.forms[0].setAttribute('target', '_blank') // 加了_blank可能出问题所以我注释了
  250. document.punchout_form.submit();
  251. // document.getElementById('alipay_submit').submit();
  252. console.log('alipage',res);
  253. }).catch(err=>{
  254. console.log('alipage err',err);
  255. })
  256. },
  257. //支付宝退款
  258. handleAliRefund(){
  259. let aliTradeNo = null;
  260. try {
  261. aliTradeNo = uni.getStorageSync('aliTradeNo');
  262. if (aliTradeNo) {
  263. console.log(aliTradeNo);
  264. }
  265. } catch (e) {
  266. console.log('handleAliRefund e',e)
  267. // error
  268. };
  269. this.$u.api.alirefund({outTradeNo:aliTradeNo})
  270. .then(res=>{
  271. alert(res.retHead.errMsg);
  272. console.log('handleAliRefund res',res);
  273. }).catch(err=>{
  274. console.log('handleAliRefund err',err);
  275. })
  276. },
  277. handleAliPayPage(){
  278. this.$u.api.aliPayPage()
  279. .then(res=>{
  280. console.log('handleAliPayPage res',res);
  281. }).catch(err=>{
  282. console.log('handleAliPayPage err',err);
  283. })
  284. },
  285. handleAligetPayimg(){
  286. let tradeNo = new Date().getTime();
  287. this.$u.api.getPayimg({outTradeNo:tradeNo})
  288. .then(res=>{
  289. this.qrcontent = res.retBody;
  290. console.log('handleAliPayPage res',res);
  291. }).catch(err=>{
  292. console.log('handleAliPayPage err',err);
  293. })
  294. },
  295. // handleShowScanner
  296. handleShowScanner(){
  297. this.scannerText = null,
  298. this.showScanner = true;
  299. },
  300. handleCloseScanner(){
  301. this.scannerText = null,
  302. this.showScanner = false;
  303. },
  304. handleBarcode(){
  305. this.$u.api.barcode({authCode:this.scannerText})
  306. .then(res=>{
  307. console.log('handleBarcode res',res);
  308. this.scannerText = null;
  309. this.showScanner = false;
  310. console.log('this.scannerText',this.scannerText);
  311. alert(res.retHead.errMsg);
  312. }).catch(err=>{
  313. this.scannerText = null;
  314. console.log('this.scannerText',this.scannerText);
  315. console.log('handleBarcode err',err);
  316. })
  317. }
  318. }
  319. }
  320. </script>
  321. <style lang="scss">
  322. page{
  323. background-color: #ededed;
  324. }
  325. .camera{
  326. width: 54px;
  327. height: 44px;
  328. &:active{
  329. background-color: #ededed;
  330. }
  331. }
  332. .user-box{
  333. background-color: #fff;
  334. }
  335. // 获取扫描枪内容
  336. .scanner{position: fixed;left: 0;top: 0;bottom: 0;right: 0;padding: 0 20px;background: rgba(0,0,0,0.5);z-index: 999;display: flex;align-items: center;justify-content: center;}
  337. .scanner .u-field{background-color: #fff;}
  338. </style>