walletService.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. import axios from 'axios';
  2. import * as SecureStore from 'expo-secure-store';
  3. class WalletService {
  4. private apiUrl: string;
  5. constructor() {
  6. this.apiUrl = process.env.EXPO_PUBLIC_API_URL;
  7. if (!this.apiUrl) {
  8. throw new Error('API URL is not defined in environment variables');
  9. }
  10. }
  11. async getCouponForSpecificUser(userID: string) {
  12. try {
  13. const response = await axios.get(`${this.apiUrl}/clients/promotion/coupons/${userID}`, {
  14. headers: {
  15. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  16. }
  17. });
  18. if (response.status === 200 || response.status === 201) {
  19. return response.data;
  20. } else {
  21. return false;
  22. }
  23. } catch (error) {
  24. console.error('Error in getCouponForSpecificUser:', error);
  25. throw error;
  26. }
  27. }
  28. async getCustomerInfo() {
  29. try {
  30. const response = await axios.get(`${this.apiUrl}/clients/customer`, {
  31. headers: {
  32. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  33. }
  34. });
  35. if (response.status === 200 || response.status === 201) {
  36. const info = response.data;
  37. return info;
  38. } else {
  39. console.error('get customer info failed:', response.status);
  40. return false;
  41. }
  42. } catch (error) {
  43. if (axios.isAxiosError(error)) {
  44. console.error('get customer info error:', error.response?.data?.message || error.message);
  45. } else {
  46. console.error('An unexpected error occurred:', error);
  47. }
  48. return false;
  49. }
  50. }
  51. async getWalletBalance() {
  52. try {
  53. const response = await axios.get(`${this.apiUrl}/clients/customer/wallet`, {
  54. headers: {
  55. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  56. }
  57. });
  58. if (response.status === 200) {
  59. const walletBalance = response.data.data;
  60. return walletBalance;
  61. } else {
  62. console.error('getWalletBalance failed:', response.status);
  63. return false;
  64. }
  65. } catch (error) {
  66. if (axios.isAxiosError(error)) {
  67. console.error('getWallet error:', error.response?.data?.message || error.message);
  68. } else {
  69. console.error('An unexpected error occurred:', error);
  70. }
  71. return false;
  72. }
  73. }
  74. async getOutTradeNo() {
  75. try {
  76. const response = await axios.get(`${this.apiUrl}/clients/qfpay/out_trade_no`, {
  77. headers: {
  78. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  79. }
  80. });
  81. if (response.status === 200) {
  82. const outTradeNo = response.data.out_trade_no;
  83. return outTradeNo;
  84. } else {
  85. console.error('get outTradeNo failed:', response.status);
  86. return false;
  87. }
  88. } catch (error) {
  89. if (axios.isAxiosError(error)) {
  90. console.error('get outTradeNo error:', error.response?.data?.message || error.message);
  91. } else {
  92. console.error('An unexpected error occurred:', error);
  93. }
  94. return false;
  95. }
  96. }
  97. async getTransactionRecord() {
  98. try {
  99. const response = await axios.get(`${this.apiUrl}/clients/wallet/transaction/record`, {
  100. headers: {
  101. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  102. }
  103. });
  104. if (response.status === 200) {
  105. const walletBalance = response.data;
  106. return walletBalance;
  107. } else {
  108. console.error('getWalletBalance failed:', response.status);
  109. return false;
  110. }
  111. } catch (error) {
  112. if (axios.isAxiosError(error)) {
  113. console.error('getWallet error:', error.response?.data?.message || error.message);
  114. } else {
  115. console.error('An unexpected error occurred:', error);
  116. }
  117. return false;
  118. }
  119. }
  120. async submitPayment(
  121. stationID: string,
  122. connector: string,
  123. user: string,
  124. book_time: string,
  125. end_time: string,
  126. total_power: string,
  127. total_fee: string,
  128. promotion_code: string,
  129. car: string,
  130. type?: string,
  131. is_ic_call?: boolean
  132. ) {
  133. try {
  134. const payload = {
  135. stationID,
  136. connector,
  137. user,
  138. book_time,
  139. end_time,
  140. total_power,
  141. total_fee,
  142. promotion_code,
  143. car,
  144. type,
  145. is_ic_call
  146. };
  147. const response = await axios.post(`${this.apiUrl}/clients/pay`, payload, {
  148. headers: {
  149. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  150. }
  151. });
  152. if (response.status === 200 || response.status === 201) {
  153. return response.data;
  154. } else {
  155. return false;
  156. }
  157. } catch (error) {
  158. return false;
  159. }
  160. }
  161. async newSubmitPayment(
  162. stationID: string,
  163. connector: string,
  164. user: string,
  165. book_time: string,
  166. end_time: string,
  167. total_power: number,
  168. total_fee: number,
  169. promotion_code: string[],
  170. with_coupon: boolean,
  171. car: string,
  172. type?: string,
  173. is_ic_call?: boolean
  174. ) {
  175. try {
  176. const payload = {
  177. stationID,
  178. connector,
  179. user,
  180. book_time,
  181. end_time,
  182. total_power,
  183. total_fee,
  184. promotion_code,
  185. with_coupon,
  186. car,
  187. type,
  188. is_ic_call
  189. };
  190. const response = await axios.post(`${this.apiUrl}/clients/pay`, payload, {
  191. headers: {
  192. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  193. }
  194. });
  195. if (response.data.status === 200 || response.data.status === 201) {
  196. return response.data.status;
  197. } else {
  198. return response.data;
  199. }
  200. } catch (error) {
  201. if (axios.isAxiosError(error)) {
  202. return {
  203. error: true,
  204. status: error.response?.status,
  205. message: error.response?.data?.message || error.message
  206. };
  207. } else {
  208. return {
  209. error: true,
  210. message: 'An unexpected error occurred'
  211. };
  212. }
  213. }
  214. }
  215. async selectPaymentType() {
  216. try {
  217. const response = await axios.get(`${this.apiUrl}/clients/qfpay/type`, {
  218. headers: {
  219. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  220. }
  221. });
  222. if (response.status === 200 || response.status === 201) {
  223. const info = response.data;
  224. return info;
  225. } else {
  226. console.error('get customer info failed:', response.status);
  227. return false;
  228. }
  229. } catch (error) {
  230. if (axios.isAxiosError(error)) {
  231. console.error('get customer info error:', error.response?.data?.message || error.message);
  232. } else {
  233. console.error('An unexpected error occurred:', error);
  234. }
  235. return false;
  236. }
  237. }
  238. async submitPaymentAfterSelectingType(amount: number, pay_type: string, return_url?: string) {
  239. try {
  240. const response = await axios.get(
  241. `${this.apiUrl}/clients/qfpay/session?amount=${amount}&pay_type=${pay_type}&return_url=${return_url}`,
  242. {
  243. headers: {
  244. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  245. }
  246. }
  247. );
  248. // if (response.status === 200 || response.status === 201) {
  249. if (response) {
  250. const info = response.data;
  251. return info;
  252. } else {
  253. console.error('get customer info failed:', response.status);
  254. return false;
  255. }
  256. } catch (error) {
  257. if (axios.isAxiosError(error)) {
  258. console.error('get customer info error:', error.response?.data?.message || error.message);
  259. } else {
  260. console.error('An unexpected error occurred:', error);
  261. }
  262. return false;
  263. }
  264. }
  265. async checkPaymentStatus(out_trade_no: string) {
  266. try {
  267. const response = await axios.get(`${this.apiUrl}/clients/qfpay/check/transaction/${out_trade_no}`, {
  268. headers: {
  269. Authorization: `Bearer ${await SecureStore.getItemAsync('accessToken')}`
  270. }
  271. });
  272. if (Array.isArray(response.data.data) && response.data.data.length > 0) {
  273. // If it's not empty, consider it a success and return the data
  274. return response.data.data;
  275. } else {
  276. // If it's an empty array, consider it false
  277. return false;
  278. }
  279. } catch (error) {
  280. if (axios.isAxiosError(error)) {
  281. console.error('check payment status error:', error.response?.data?.message || error.message);
  282. } else {
  283. console.error('An unexpected error occurred:', error);
  284. }
  285. return false;
  286. }
  287. }
  288. }
  289. export const walletService = new WalletService();