import { 
 | 
  useLifeRechargeContext, 
 | 
  SetLifePayOrderPayTypeInput, 
 | 
  LifeRechargeConstants, 
 | 
  GetPayOrderForJsAPIInput, 
 | 
} from '@life-payment/core-vue'; 
 | 
import { useQuery } from '@tanstack/vue-query'; 
 | 
import { reactive, MaybeRef, unref } from 'vue'; 
 | 
import Taro from '@tarojs/taro'; 
 | 
  
 | 
type UseSelectPayTypeOptions = { 
 | 
  isInWeChat?: MaybeRef<boolean>; 
 | 
  isH5?: MaybeRef<boolean>; 
 | 
  appId?: MaybeRef<string>; 
 | 
  getOpenId?: MaybeRef<() => Promise<string>>; 
 | 
}; 
 | 
  
 | 
export function useSelectPayType(options: UseSelectPayTypeOptions = {}) { 
 | 
  const { isInWeChat, isH5, appId, getOpenId } = options; 
 | 
  
 | 
  const { blLifeRecharge } = useLifeRechargeContext(); 
 | 
  
 | 
  const state = reactive({ 
 | 
    show: false, 
 | 
    msg: '', 
 | 
  }); 
 | 
  
 | 
  async function invokeAliPay(orderNo: string) { 
 | 
    try { 
 | 
      let res = await setLifePayOrderPayType( 
 | 
        blLifeRecharge.constants.LifePayTypeEnum.AliPay, 
 | 
        orderNo 
 | 
      ); 
 | 
      if (res) { 
 | 
        location.href = res; 
 | 
      } 
 | 
    } catch (error) { 
 | 
      throw error; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  async function setLifePayOrderPayType( 
 | 
    lifePayType: LifeRechargeConstants.LifePayTypeEnum, 
 | 
    orderNo: string 
 | 
  ) { 
 | 
    try { 
 | 
      let params: SetLifePayOrderPayTypeInput = { 
 | 
        orderNo: orderNo, 
 | 
        lifePayType: lifePayType, 
 | 
      }; 
 | 
      return await blLifeRecharge.services.setLifePayOrderPayType(params); 
 | 
    } catch (error) { 
 | 
      throw error; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  async function invokeWeixinPay(orderNo: string) { 
 | 
    if (unref(isH5)) { 
 | 
      if (unref(isInWeChat)) { 
 | 
        handleWeixinPayByJsApi(orderNo); 
 | 
      } else { 
 | 
        // try { 
 | 
        //   let res = await setLifePayOrderPayType(blLifeRecharge.constants.LifePayTypeEnum.WxPay); 
 | 
        //   if (res) { 
 | 
        //     location.href = res; 
 | 
        //   } 
 | 
        // } catch (error) {} 
 | 
        state.msg = '请在微信中打开'; 
 | 
        state.show = true; 
 | 
      } 
 | 
    } else if (Taro.getEnv() === Taro.ENV_TYPE.WEAPP) { 
 | 
      handleWeixinPayByMini(orderNo); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  async function handleWeixinPayByMini(orderNo: string) { 
 | 
    try { 
 | 
      let res = await getPayOrderForJsAPI(orderNo); 
 | 
  
 | 
      if (res) { 
 | 
        Taro.requestPayment({ 
 | 
          timeStamp: res.timestamp, 
 | 
          nonceStr: res.nonceStr, 
 | 
          package: res.package, 
 | 
          signType: res.signType as any, 
 | 
          paySign: res.paySign, 
 | 
          success: function (res) { 
 | 
            console.log('res: ', res); 
 | 
            // if(res.errMsg) 
 | 
          }, 
 | 
          fail: function (res) {}, 
 | 
        }); 
 | 
      } 
 | 
    } catch (error) { 
 | 
      throw error; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  async function getPayOrderForJsAPI(orderNo: string) { 
 | 
    try { 
 | 
      const _getOpenId = unref(getOpenId); 
 | 
      const openId = await _getOpenId(); 
 | 
      let params: GetPayOrderForJsAPIInput = { 
 | 
        orderNo: orderNo, 
 | 
        lifePayType: blLifeRecharge.constants.LifePayTypeEnum.WxPay, 
 | 
        openId: openId, 
 | 
        attach: Date.now().toString(), 
 | 
        payAppId: unref(appId), 
 | 
      }; 
 | 
      let res = await blLifeRecharge.services.getPayOrderForJsAPI(params); 
 | 
      return res; 
 | 
    } catch (error) { 
 | 
      throw error; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  async function handleWeixinPayByJsApi(orderNo: string) { 
 | 
    try { 
 | 
      let res = await getPayOrderForJsAPI(orderNo); 
 | 
  
 | 
      if (res) { 
 | 
        if (WeixinJSBridge) { 
 | 
          WeixinJSBridge.invoke( 
 | 
            'getBrandWCPayRequest', 
 | 
            { 
 | 
              appId: unref(appId), //公众号ID,由商户传入 
 | 
              timeStamp: res.timestamp, //时间戳,自1970年以来的秒数 
 | 
              nonceStr: res.nonceStr, //随机串 
 | 
              package: res.package, 
 | 
              signType: res.signType, //微信签名方式: 
 | 
              paySign: res.paySign, //微信签名 
 | 
            }, 
 | 
            function (res) { 
 | 
              if (res.err_msg == 'get_brand_wcpay_request:ok') { 
 | 
                // 使用以上方式判断前端返回,微信团队郑重提示: 
 | 
                //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠,商户需进一步调用后端查单确认支付结果。 
 | 
              } else if (res.err_msg == 'system:access_denied') { 
 | 
                state.msg = '请在手机微信中打开'; 
 | 
                state.show = true; 
 | 
              } else { 
 | 
                // state.msg = res.err_msg; 
 | 
                // state.show = true; 
 | 
              } 
 | 
            } 
 | 
          ); 
 | 
        } 
 | 
      } 
 | 
    } catch (error) { 
 | 
      throw error; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  return { 
 | 
    invokeAliPay, 
 | 
    invokeWeixinPay, 
 | 
    state, 
 | 
  }; 
 | 
} 
 | 
  
 | 
type UseGetPayStatusByOrderNoOptions = { 
 | 
  orderNo?: MaybeRef<string>; 
 | 
  enabled?: MaybeRef<boolean>; 
 | 
  onPaySuccess?: (orderNo: string) => any; 
 | 
}; 
 | 
  
 | 
export function useGetPayStatusByOrderNo(options: UseGetPayStatusByOrderNoOptions = {}) { 
 | 
  const { orderNo, enabled, onPaySuccess } = options; 
 | 
  
 | 
  const { blLifeRecharge } = useLifeRechargeContext(); 
 | 
  
 | 
  useQuery({ 
 | 
    queryKey: ['blLifeRecharge/getPayStatusByOrderNo', orderNo], 
 | 
    queryFn: async () => { 
 | 
      return await blLifeRecharge.services.getPayStatusByOrderNo( 
 | 
        { 
 | 
          orderNo: unref(orderNo), 
 | 
        }, 
 | 
        { 
 | 
          showLoading: false, 
 | 
        } 
 | 
      ); 
 | 
    }, 
 | 
    onSuccess(data) { 
 | 
      if (data !== blLifeRecharge.constants.LifePayStatusEnum.未支付) { 
 | 
        onPaySuccess?.(unref(orderNo)); 
 | 
      } 
 | 
    }, 
 | 
    refetchInterval: 1000 * 3, 
 | 
    enabled: enabled, 
 | 
  }); 
 | 
} 
 |