123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- <?php
- namespace addons\exam\library;
- use EasyWeChat\Factory;
- /**
- * 微信公众号、小程序服务
- */
- class WechatService
- {
- public static function getConfig(): array
- {
- $wx_config = getConfig('wx_config');
- switch (true) {
- case is_empty_in_array($wx_config, 'appid'):
- fail('缺少app_id配置');
- case is_empty_in_array($wx_config, 'secret'):
- fail('缺少secret配置');
- // case is_empty_in_array($pay_config, 'mchid'):
- // fail('缺少mchid配置');
- // case is_empty_in_array($pay_config, 'key'):
- // fail('缺少key配置');
- // case is_empty_in_array($pay_config, 'notify_url'):
- // fail('缺少支付回调配置');
- }
- return [
- 'app_id' => $wx_config['appid'],
- 'secret' => $wx_config['secret'],
- // 'mch_id' => $pay_config['mchid'],
- // 'key' => $pay_config['key'],
- // 'notify_url' => $pay_config['notify_url'],
- ];
- }
- /**
- * 公众号实例
- * @return \EasyWeChat\OfficialAccount\Application
- */
- public static function getApp(): \EasyWeChat\Payment\Application
- {
- return Factory::payment(self::getConfig());
- }
- /**
- * 小程序实例
- * @return \EasyWeChat\MiniProgram\Application
- */
- public static function getMiniApp(): \EasyWeChat\MiniProgram\Application
- {
- return Factory::miniProgram(self::getConfig());
- }
- /**
- * 支付实例
- * @return \EasyWeChat\Payment\Application
- */
- public static function getPayment(): \EasyWeChat\Payment\Application
- {
- $config = Factory::payment(self::getConfig());
- // $config['cert_path'] = APP_PATH . '/common/certs/apiclient_cert.pem';
- // $config['key_path'] = APP_PATH . '/common/certs/apiclient_key.pem';
- return $config;
- }
- /**
- * H5发起登录
- * @param array $params 回调参数
- * @param int $type 授权方式
- * @return \Symfony\Component\HttpFoundation\RedirectResponse|void
- */
- public function login(array $params = [], int $type = 0)
- {
- $scopes = $type ? 'snsapi_userinfo' : 'snsapi_base';
- $callback_url = self::CALLBACK_URL;
- $callback_url = $params ? $callback_url . '?' . http_build_query($params) : $callback_url;
- $this->getApp()->oauth->withRedirectUrl($callback_url)->scopes([$scopes])->redirect()->send();
- }
- /**
- * 小程序登录
- * @param string $code 前端js code
- * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
- * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
- */
- public function miniLogin(string $code)
- {
- $app = self::getMiniApp();
- return $app->auth->session($code);
- }
- /**
- * 统一支付
- * @param string $openid 用户open id
- * @param string $out_trade_no 订单编号
- * @param int $fee 订单金额
- * @param string $body 订单说明
- * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
- * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
- * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
- * @throws \GuzzleHttp\Exception\GuzzleException
- */
- public function unifyPay(string $openid, string $out_trade_no, int $fee, string $body)
- {
- $payment = self::getPayment();
- $result = $payment->order->unify([
- 'body' => $body,
- 'out_trade_no' => $out_trade_no,
- 'total_fee' => $fee,
- 'trade_type' => 'JSAPI',
- 'openid' => $openid,
- ]);
- if ($result['return_code'] == 'FAIL') {
- fail('发起支付失败:' . $result['return_msg']);
- }
- return $payment->jssdk->bridgeConfig($result['prepay_id'], false);
- }
- /**
- * 微信小程序消息解密
- * 比如获取电话等功能,信息是加密的,需要解密
- * @param $session
- * @param $iv
- * @param $encryptedData
- * @return mixed
- */
- public function decryptedData($session, $iv, $encryptedData)
- {
- $app = self::getMiniApp();
- return $app->encryptor->decryptData($session, $iv, $encryptedData);
- }
-
- }
|