index.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import React, {Component} from 'react'
  2. import {withRouter} from 'react-router-dom'
  3. import {message} from 'antd'
  4. import {NavBar, Icon, Checkbox, Toast} from 'antd-mobile'
  5. import classNames from 'classnames'
  6. import axios from 'axios'
  7. import {Mutation} from "react-apollo"
  8. import gql from "graphql-tag"
  9. import moment from 'moment'
  10. import {orderbyprops, update_order} from "../../../utils/gql"
  11. import {getCookie} from "../../../utils/cookie"
  12. import './index.css'
  13. import {getIsWechatBrowser} from "../../../utils/func"
  14. let clicktag = 1; //微信发起支付点击标志
  15. class Pay extends Component {
  16. constructor(props) {
  17. super(props)
  18. this.state = {
  19. checked: true,
  20. payOrder: JSON.parse(sessionStorage.getItem('payOrder'))
  21. }
  22. }
  23. changeCheckedStatus = (e) => {
  24. this.setState({
  25. checked: e.target.checked
  26. })
  27. }
  28. pay = () => {
  29. Toast.info('支付成功', 2);
  30. this.props.history.push({
  31. pathname: '/my'
  32. })
  33. }
  34. // prepay_id微信生成的预支付会话标识,用于后续接口调用中使用,该值有效期为2小时
  35. jsApiPay = (args, id, update_order) => {
  36. // console.log('jsApiPay params', args);
  37. let $this = this
  38. function onBridgeReady() {
  39. window.WeixinJSBridge.invoke(
  40. 'getBrandWCPayRequest', args,
  41. function (res) {
  42. // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
  43. if (res.err_msg === "get_brand_wcpay_request:ok") {
  44. // 成功完成支付
  45. message.success('支付成功,等待发货')
  46. let updatedAt = moment().format('YYYY-MM-DD HH:mm:ss')
  47. const updateContent = {
  48. id,
  49. orderStatus: '1',
  50. updatedAt
  51. }
  52. update_order({variables: updateContent})
  53. $this.props.history.push({
  54. pathname: '/my'
  55. })
  56. }
  57. else {
  58. if (res.err_msg === "get_brand_wcpay_request:cancel") {
  59. message.warning('您的支付已经取消')
  60. } else if (res.err_msg === "get_brand_wcpay_request:fail") {
  61. message.error('支付失败,请稍后重试')
  62. } else {
  63. message.error('支付失败,请稍后重试')
  64. }
  65. }
  66. }
  67. );
  68. }
  69. if (typeof window.WeixinJSBridge === "undefined") {
  70. if (document.addEventListener) {
  71. document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false)
  72. } else if (document.attachEvent) {
  73. document.attachEvent('WeixinJSBridgeReady', onBridgeReady)
  74. document.attachEvent('onWeixinJSBridgeReady', onBridgeReady)
  75. }
  76. } else {
  77. onBridgeReady()
  78. }
  79. }
  80. getBridgeReady = (update_order, id, needPay) => {
  81. // console.log('getBridgeReady params',id,needPay)
  82. let isWechat = getIsWechatBrowser()
  83. if (clicktag === 1 && isWechat) {
  84. clicktag = 0 //进行标志,防止多次点击
  85. let openid = getCookie('openid')
  86. let $this = this
  87. axios.get('http://localhost:3000/payinfo', {
  88. params: {
  89. needPay: parseInt(needPay * 100, 10),
  90. openid,
  91. tradeNo: id
  92. }
  93. })
  94. .then((res) => {
  95. // console.log('onBridgeReady res',res)
  96. $this.jsApiPay(res.data, id, update_order)
  97. setTimeout(() => {
  98. clicktag = 1
  99. }, 5000)
  100. })
  101. .catch((error) => {
  102. message.warning('网络或系统故障,请稍后重试')
  103. console.log('onBridgeReady error', error)
  104. })
  105. } else {
  106. message.info('当前只支持在微信中打开')
  107. }
  108. }
  109. render() {
  110. let {checked, payOrder} = this.state
  111. let {id, orderTotalPay} = payOrder
  112. let user_id = getCookie('user_id')
  113. return (
  114. <div className='pay-wrap'>
  115. <div className='pay-navbar-wrap navbar'>
  116. <NavBar
  117. className='pay-navbar'
  118. mode="light"
  119. icon={<Icon type="left"/>}
  120. onLeftClick={() => {
  121. this.props.history.goBack()
  122. }}
  123. >订单支付</NavBar>
  124. </div>
  125. <div className='pay-content-wrap content-wrap'>
  126. <div className='pay-content-price'>
  127. <p>订单金额:</p>
  128. <p>¥: {orderTotalPay}</p>
  129. </div>
  130. <div className='pay-content-type'>
  131. <p>请选择支付方式</p>
  132. <div>
  133. <img src="https://ece-img-1254337200.cos.ap-chengdu.myqcloud.com/icon/wechat.png" alt=''/>
  134. <span>微信支付</span>
  135. <span>
  136. <Checkbox checked={checked} onChange={(e) => this.changeCheckedStatus(e)}/>
  137. </span>
  138. </div>
  139. </div>
  140. </div>
  141. <div className="confirm-footer">
  142. <Mutation mutation={gql(update_order)}
  143. onError={error => console.log('error', error)}
  144. refetchQueries={[
  145. {query: gql(orderbyprops), variables: {user_id, orderStatus: '1'}},
  146. {query: gql(orderbyprops), variables: {user_id, orderStatus: '0'}},
  147. ]}
  148. >
  149. {(update_order, {loading, error}) => (
  150. <button
  151. className={classNames({
  152. 'confirm-button': true,
  153. 'pay-disabled': !checked
  154. })}
  155. onClick={() => {
  156. if (checked) {
  157. // this.pay()
  158. // const updateContent = {
  159. // id,
  160. // orderStatus: '1',
  161. // updatedAt: '123'
  162. // }
  163. // update_order({variables: updateContent})
  164. this.getBridgeReady(update_order, id, orderTotalPay)
  165. }
  166. }}>
  167. <span>确认支付</span>
  168. </button>
  169. )}
  170. </Mutation>
  171. </div>
  172. </div>
  173. )
  174. }
  175. }
  176. export default withRouter(Pay)