AlipayService.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. <?php
  2. namespace addons\AvoidTax\common\service;
  3. use addons\AvoidTax\common\jdk\alipay\AlipayConfig;
  4. use addons\AvoidTax\common\jdk\alipay\AopCertClient;
  5. use addons\AvoidTax\common\jdk\alipay\AopClient;
  6. use addons\AvoidTax\common\jdk\alipay\request\AlipayFundAccountbookCreateRequest;
  7. use addons\AvoidTax\common\jdk\alipay\request\AlipayFundAccountbookQueryRequest;
  8. use addons\AvoidTax\common\jdk\alipay\request\AlipayFundAccountQueryRequest;
  9. use addons\AvoidTax\common\jdk\alipay\request\AlipayFundTransCommonQueryRequest;
  10. use addons\AvoidTax\common\jdk\alipay\request\AlipayFundTransPagePayRequest;
  11. use addons\AvoidTax\common\jdk\alipay\request\AlipayFundTransUniTransferRequest;
  12. use addons\AvoidTax\common\jdk\alipay\request\AlipaySystemOauthTokenRequest;
  13. use addons\AvoidTax\common\jdk\alipay\request\AlipayUserAgreementPageSignRequest;
  14. use addons\AvoidTax\common\jdk\alipay\request\AlipayUserAgreementQueryRequest;
  15. use addons\AvoidTax\common\jdk\alipay\request\AlipayUserCertdocCertverifyConsultRequest;
  16. use addons\AvoidTax\common\jdk\alipay\request\AlipayUserCertdocCertverifyPreconsultRequest;
  17. use addons\AvoidTax\common\models\TaxConfig;
  18. use Exception;
  19. use Yii;
  20. use yii\helpers\Json;
  21. /**
  22. * AliPaySerivce
  23. */
  24. class AlipayService extends BaseService
  25. {
  26. /**
  27. * 服务地址
  28. */
  29. const SERVICE_URL = 'https://openapi.alipay.com/gateway.do';
  30. // const SERVICE_URL = 'https://openapi.alipaydev.com/gateway.do';
  31. /**
  32. * format
  33. */
  34. const FORMAT = 'JSON';
  35. /**
  36. * charset
  37. */
  38. const CHAR = 'UTF-8';
  39. /**
  40. * signType
  41. */
  42. const SIGNTYPE = 'RSA2';
  43. /**
  44. * config
  45. *
  46. * @var array
  47. */
  48. public $config;
  49. /**
  50. * alipayConfig
  51. *
  52. * @var AlipayConfig
  53. */
  54. protected $alipayConfig;
  55. /**
  56. * AopClient
  57. *
  58. * @var AopClient
  59. */
  60. protected $aopClient;
  61. public function __construct($mall_id)
  62. {
  63. parent::__construct(compact('mall_id'));
  64. $config = (new TaxConfigService(['mall_id' => $this->mall_id]))->getAlipayConfig();
  65. if (empty($config)) {
  66. throw new Exception('未定义配置');
  67. }
  68. $this->config = $config;
  69. $this->setAlipayConfig();
  70. $this->setAopClient();
  71. }
  72. /**
  73. * 设置AlipayConfig
  74. *
  75. * @param AlipayConfig $alipay_config
  76. * @return void
  77. */
  78. public function setAlipayConfig($alipay_config = null)
  79. {
  80. if (empty($alipay_config)) {
  81. $alipay_config = new AlipayConfig();
  82. $alipay_config->setServerUrl(self::SERVICE_URL);
  83. $alipay_config->setAppId($this->config['app_id']);
  84. $alipay_config->setPrivateKey(trim($this->config['private_key']));
  85. $alipay_config->setFormat(self::FORMAT);
  86. // $alipay_config->setAlipayPublicKey(trim($this->config['alipay_publicKey']));
  87. $alipay_config->setCharset(self::CHAR);
  88. $alipay_config->setSignType(self::SIGNTYPE);
  89. $alipay_config->setAlipayPublicCertContent(trim($this->config['alipay_public_key']));
  90. $alipay_config->setAppCertContent(trim($this->config['app_public_key']));
  91. $alipay_config->setRootCertContent(trim($this->config['alipay_root']));
  92. }
  93. $this->alipayConfig = $alipay_config;
  94. }
  95. /**
  96. * 设置AopClient
  97. *
  98. * @return void
  99. */
  100. public function setAopClient()
  101. {
  102. $this->aopClient = new AopClient($this->alipayConfig);
  103. }
  104. public function setAopCertClient()
  105. {
  106. $this->aopClient = new AopCertClient($this->alipayConfig);
  107. }
  108. /**
  109. * 用户协议签约的页面接口
  110. *
  111. * @return string
  112. */
  113. public function agreementPageSign($external_agreement_no)
  114. {
  115. $request = new AlipayUserAgreementPageSignRequest();
  116. $content = [
  117. // 请按当前接入的方式进行填充,且输入值必须为文档中的参数取值范围。
  118. // 扫码或者短信页面签约需要拼装http的请求地址访问中间页面,钱包h5页面签约可直接拼接scheme的请求地址
  119. 'access_params' => [
  120. 'channel' => 'QRCODE',
  121. ],
  122. // 协议产品码,商户和支付宝签约时确定,不同业务场景对应不同的签约产品码。
  123. 'personal_product_code' => 'FUND_SAFT_SIGN_WITHHOLDING_P',
  124. // 签约场景
  125. 'sign_scene' => 'INDUSTRY|SATF_ACC',
  126. // 第三方主体类型
  127. 'third_party_type' => 'PARTNER',
  128. // 商家签约的产品码,固定值
  129. 'product_code' => 'FUND_SAFT_SIGN_WITHHOLDING',
  130. // 商户签约号,协议中标示用户的唯一签约号(确保在商户系统中唯一)。 格式规则:支持大写小写字母和数字,最长32位。
  131. 'external_agreement_no' => $external_agreement_no,
  132. ];
  133. $request->setNotifyUrl(
  134. \Yii::$app->services->setting->get('system.api_url') . '/avoid-tax/notify/account?mall_id=' . $this->mall_id
  135. );
  136. $this->setAopCertClient();
  137. $request->setBizContent(Json::encode(
  138. $content
  139. ));
  140. return $responseResult = $this->aopClient->pageExecute($request);
  141. }
  142. /**
  143. * 签约查询
  144. *
  145. * @param string $external_agreement_no
  146. * @return boolean|object
  147. */
  148. public function agreementQuery($external_agreement_no)
  149. {
  150. $request = new AlipayUserAgreementQueryRequest();
  151. $content = array_merge(
  152. [
  153. // 个人产品码,固定值。
  154. 'personal_product_code' => 'FUND_SAFT_SIGN_WITHHOLDING_P',
  155. // 场景码,固定值。
  156. 'sign_scene' => 'INDUSTRY|SATF_ACC',
  157. // 商户产品码,固定值。
  158. 'product_code' => 'FUND_SAFT_SIGN_WITHHOLDING',
  159. // 必传 ?
  160. 'third_party_type' => 'PARTNER',
  161. ],
  162. compact('external_agreement_no')
  163. );
  164. $this->setAopCertClient();
  165. return $this->getResponse($request, $content);
  166. }
  167. /**
  168. * 记帐本开通
  169. *
  170. * @param string $merchant_user_id 外部商户系统会员的唯一标识,用于开户时候的唯一性约束管控
  171. * @param string $agreement_no 支付宝协议号
  172. * @return boolean|object
  173. */
  174. public function accountbookCreate($merchant_user_id, $agreement_no)
  175. {
  176. $request = new AlipayFundAccountbookCreateRequest();
  177. $content = [
  178. // 资金记账本的业务场景,固定值。
  179. 'scene_code' => 'SATF_FUND_BOOK',
  180. // 外部商户用户类型,固定值。
  181. 'merchant_user_type' => 'BUSINESS_ORGANIZATION',
  182. // 外部商户系统会员的唯一标识,用于开户时候的唯一性约束管控。
  183. 'merchant_user_id' => $merchant_user_id,
  184. // 支付宝协议号
  185. 'ext_info' => compact('agreement_no'),
  186. ];
  187. $this->setAopCertClient();
  188. return $this->getResponse($request, $content);
  189. }
  190. /**
  191. * 记帐本查询
  192. *
  193. * @param string $account_book_id 资金记账本id
  194. * @param string $agreement_no 支付宝协议号
  195. * @return boolean|object
  196. */
  197. public function bookQuery($account_book_id, $agreement_no)
  198. {
  199. $request = new AlipayFundAccountbookQueryRequest();
  200. $content = [
  201. // 资金记账本的业务场景,固定值。
  202. 'scene_code' => 'SATF_FUND_BOOK',
  203. // 外部商户用户类型,固定值。
  204. 'account_book_id' => $account_book_id,
  205. // 支付宝协议号
  206. 'ext_info' => compact('agreement_no'),
  207. ];
  208. $this->setAopCertClient();
  209. return $this->getResponse($request, $content);
  210. }
  211. /**
  212. * 记账本资金专款拨入(商户给人力资源记账本转账)
  213. *
  214. * @param string $out_biz_no 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。
  215. * @param string $identity 记账本 id 的值
  216. * @param string $order_title 转账业务的标题,用于在支付宝用户的账单里显示。
  217. * @param string $agreement_no 支付宝系统中用以唯一标识用户签约记录的编号。
  218. * @param float $trans_amount 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  219. * @param string $remark 业务备注
  220. * @return boolean|object
  221. */
  222. public function transUniTransferBook(
  223. $out_biz_no, $identity, $order_title, $agreement_no, $trans_amount, $remark = ''
  224. )
  225. {
  226. $request = new AlipayFundTransUniTransferRequest();
  227. $content = [
  228. // 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。
  229. 'out_biz_no' => $out_biz_no,
  230. // 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  231. 'trans_amount' => $trans_amount,
  232. // 产品码,固定值
  233. 'product_code' => 'SINGLE_TRANSFER_NO_PWD',
  234. // 资金归集,固定值。
  235. 'biz_scene' => 'DIRECT_ALLOCATION',
  236. // Participant类型,收款方信息
  237. 'payee_info' => [
  238. // 固定值 ACCOUNT_BOOK_ID
  239. 'identity_type' => 'ACCOUNT_BOOK_ID',
  240. // 记账本 id 的值
  241. 'identity' => $identity,
  242. // 转账业务请求的扩展参数,支持传入的扩
  243. 'ext_info' => Json::encode([
  244. // 支付宝系统中用以唯一标识用户签约记录的编号。
  245. 'agreement_no' => $agreement_no,
  246. ]),
  247. ],
  248. // 转账业务的标题,用于在支付宝用户的账单里显示。
  249. 'order_title' => $order_title,
  250. // 业务备注
  251. 'remark' => $remark,
  252. // 转账业务请求的扩展参数
  253. 'business_params' => Json::encode([
  254. // 使用别名作为付款方显示名称,可选。收款方在支付宝账单中可见,使用详情可查看
  255. 'payer_show_name_use_alias' => true,
  256. ]),
  257. ];
  258. $this->setAopCertClient();
  259. return $this->getResponse($request, $content);
  260. }
  261. /**
  262. * 通过记账本转账给用户
  263. *
  264. * @param string $out_biz_no
  265. * @param float $trans_amount
  266. * @param string $order_title
  267. * @param array $user
  268. * @param array $book
  269. * @param string $remark
  270. * @return boolean
  271. */
  272. public function bookTransUniTransferUser(
  273. $out_biz_no, $trans_amount, $order_title, $user, $book, $remark = ''
  274. )
  275. {
  276. $request = new AlipayFundTransUniTransferRequest();
  277. $content = [
  278. // 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。
  279. 'out_biz_no' => $out_biz_no,
  280. // 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  281. 'trans_amount' => $trans_amount,
  282. // 产品码,固定值
  283. 'product_code' => 'SINGLE_TRANSFER_NO_PWD',
  284. // 资金归集,固定值。
  285. 'biz_scene' => 'ENTRUST_TRANSFER',
  286. // 转账业务的标题,用于在支付宝用户的账单里显示。
  287. 'order_title' => $order_title,
  288. // Participant类型,收款方信息
  289. 'payee_info' => [
  290. // 固定值 ALIPAY_LOGON_ID
  291. 'identity_type' => 'ALIPAY_LOGON_ID',
  292. // 用户id
  293. 'identity' => $user['identity'],
  294. 'name' => $user['name'],
  295. ],
  296. // Participant类型,付款方信息
  297. 'payer_info' => [
  298. // 记帐本ID
  299. 'identity' => $book['account_book_id'],
  300. // 固定值 ACCOUNT_BOOK_ID
  301. 'identity_type' => 'ACCOUNT_BOOK_ID',
  302. 'ext_info' => Json::encode([
  303. 'agreement_no' => $book['agreement_no'],
  304. ]),
  305. ],
  306. // 转账业务请求的扩展参数
  307. 'business_params' => Json::encode([
  308. // 使用别名作为付款方显示名称,可选。收款方在支付宝账单中可见,使用详情可查看
  309. 'payer_show_name_use_alias' => true,
  310. ]),
  311. // 业务备注
  312. 'remark' => $remark,
  313. ];
  314. $this->setAopCertClient();
  315. return $this->getResponse($request, $content);
  316. }
  317. /**
  318. * 企业支付宝单笔转账
  319. *
  320. * @param string $out_biz_no
  321. * @param string $trans_amount
  322. * @param string $order_title
  323. * @param array $user
  324. * @param array $book
  325. * @param string $remark
  326. * @return boolean|object
  327. */
  328. public function transUniTransferUser(
  329. $out_biz_no, $trans_amount, $order_title, $user, $product_code, $remark = ''
  330. )
  331. {
  332. $request = new AlipayFundTransUniTransferRequest();
  333. $content = [
  334. // 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。
  335. 'out_biz_no' => $out_biz_no,
  336. // 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  337. 'trans_amount' => $trans_amount,
  338. // 产品码,固定值
  339. 'product_code' => $product_code,
  340. // 资金归集,固定值。
  341. 'biz_scene' => 'DIRECT_TRANSFER',
  342. // 转账业务的标题,用于在支付宝用户的账单里显示。
  343. 'order_title' => $order_title,
  344. // Participant类型,收款方信息
  345. 'payee_info' => [
  346. // 固定值 ALIPAY_LOGON_ID
  347. 'identity_type' => 'ALIPAY_LOGON_ID',
  348. // 用户id
  349. 'identity' => $user['identity'],
  350. 'name' => $user['name'],
  351. ],
  352. // 转账业务请求的扩展参数
  353. 'business_params' => Json::encode([
  354. // 使用别名作为付款方显示名称,可选。收款方在支付宝账单中可见,使用详情可查看
  355. 'payer_show_name_use_alias' => true,
  356. ]),
  357. // 业务备注
  358. 'remark' => $remark,
  359. ];
  360. $this->setAopCertClient();
  361. return $this->getResponse($request, $content);
  362. }
  363. /**
  364. * 通过支付宝ID打款
  365. *
  366. * @param string $out_biz_no
  367. * @param float $trans_amount
  368. * @param string $order_title
  369. * @param string $user_id
  370. * @param string $remark
  371. * @return array|object
  372. */
  373. public function transUniTransferUserByUserId(
  374. string $out_biz_no, float $trans_amount, string $order_title, string $user_id,
  375. array $book, string $remark = ''
  376. )
  377. {
  378. $request = new AlipayFundTransUniTransferRequest();
  379. $content = [
  380. // 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。
  381. 'out_biz_no' => $out_biz_no,
  382. // 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  383. 'trans_amount' => $trans_amount,
  384. // 产品码,固定值
  385. 'product_code' => 'SINGLE_TRANSFER_NO_PWD',
  386. // 资金归集,固定值。
  387. 'biz_scene' => 'ENTRUST_TRANSFER',
  388. // 转账业务的标题,用于在支付宝用户的账单里显示。
  389. 'order_title' => $order_title,
  390. // Participant类型,收款方信息
  391. 'payee_info' => [
  392. // 固定值 ALIPAY_USER_ID
  393. 'identity_type' => 'ALIPAY_USER_ID',
  394. // 用户id
  395. 'identity' => $user_id,
  396. ],
  397. // Participant类型,付款方信息
  398. 'payer_info' => [
  399. // 记帐本ID
  400. 'identity' => $book['account_book_id'],
  401. // 固定值 ACCOUNT_BOOK_ID
  402. 'identity_type' => 'ACCOUNT_BOOK_ID',
  403. 'ext_info' => Json::encode([
  404. 'agreement_no' => $book['agreement_no'],
  405. ]),
  406. ],
  407. // 转账业务请求的扩展参数
  408. 'business_params' => Json::encode([
  409. // 使用别名作为付款方显示名称,可选。收款方在支付宝账单中可见,使用详情可查看
  410. 'payer_show_name_use_alias' => true,
  411. ]),
  412. // 业务备注
  413. 'remark' => $remark,
  414. ];
  415. $this->setAopCertClient();
  416. return $this->getResponse($request, $content);
  417. }
  418. /**
  419. * 记账本资金订单查询
  420. *
  421. * @param string $out_biz_no 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一
  422. * @return boolean|object
  423. */
  424. public function transCommonQuery($out_biz_no)
  425. {
  426. $request = new AlipayFundTransCommonQueryRequest();
  427. $content = [
  428. // 产品码,和申请时候的参数一致。
  429. 'product_code' => 'SINGLE_TRANSFER_NO_PWD',
  430. // 描述特定的业务场景传入,传入下单时的场景码。
  431. 'biz_scene' => 'DIRECT_ALLOCATION',
  432. // 商户转账唯一订单号:发起转账来源方定义的转账单据
  433. 'out_biz_no' => $out_biz_no,
  434. ];
  435. return $this->getResponse($request, $content);
  436. }
  437. /**
  438. * 实名证件信息比对验证预咨询
  439. *
  440. * @param string $mobile
  441. * @param string $id_card
  442. * @param string $name
  443. * @return boolean|object
  444. */
  445. public function certdocCertverifyPreconsult($mobile, $id_card, $name)
  446. {
  447. $request = new AlipayUserCertdocCertverifyPreconsultRequest();
  448. $content = [
  449. 'user_name' => $name,
  450. 'cert_type' => 'IDENTITY_CARD',
  451. 'cert_no' => $id_card,
  452. 'logon_id' => $mobile,
  453. ];
  454. $this->setAopCertClient();
  455. return $this->getResponse($request, $content);
  456. }
  457. /**
  458. * 实名证件信息比对验证咨询
  459. *
  460. * @param string $verify_id 通过「实名证件信息比对验证预咨询」获取
  461. * @return boolean|object
  462. */
  463. public function certdocCertverifyConsult(string $verify_id)
  464. {
  465. $request = new AlipayUserCertdocCertverifyConsultRequest();
  466. $content = [
  467. 'verify_id' => $verify_id,
  468. ];
  469. $this->setAopCertClient();
  470. return $this->getResponse($request, $content);
  471. }
  472. /**
  473. * 换取授权访问令牌
  474. *
  475. * @return void
  476. */
  477. public function oauthToken($code = null)
  478. {
  479. // 授权码,用户对应用授权后得到。本参数在 grant_type 为 authorization_code 时必填;为 refresh_token 时不填。
  480. $grant_type = empty($code) ? 'refresh_token' : 'authorization_code';
  481. $request = new AlipaySystemOauthTokenRequest();
  482. $request->setGrantType($grant_type);
  483. $code && $request->setCode($code);
  484. $this->setAopCertClient();
  485. return $this->getResponseForOauthToken($request);
  486. }
  487. /**
  488. * 记账本充值
  489. *
  490. * @param string $out_biz_no
  491. * @param float $amount
  492. * @param string $identity
  493. * @param string $agreement_no
  494. * @return void
  495. */
  496. public function recharge(
  497. string $out_biz_no, float $amount, string $identity, string $agreement_no
  498. )
  499. {
  500. $request = new AlipayFundTransPagePayRequest();
  501. $content = [
  502. 'out_biz_no' => $out_biz_no,
  503. 'trans_amount' => $amount,
  504. 'product_code' => 'FUND_ACCOUNT_BOOK',
  505. 'biz_scene' => 'SATF_DEPOSIT',
  506. 'time_expire' => date('Y-m-d H:i', strtotime('+1 hours')),
  507. 'remark' => '充值',
  508. 'order_title' => '充值',
  509. 'payee_info' => [
  510. 'identity_type' => 'ACCOUNT_BOOK_ID',
  511. 'identity' => $identity,
  512. 'ext_info' => Json::encode([
  513. 'agreement_no' => $agreement_no,
  514. ]),
  515. ],
  516. ];
  517. $this->setAopCertClient();
  518. $request->setBizContent(Json::encode(
  519. $content
  520. ));
  521. return $this->aopClient->pageExecute($request);
  522. }
  523. /**
  524. * 授权URL
  525. *
  526. * @param string $verify_id
  527. * @return string
  528. */
  529. public function getAppAuthorizeUrl(string $verify_id)
  530. {
  531. // 若需要拼接授权 URL 时设置多个 scope,多个 scope 值间用英文逗号 , 分隔(例如:id_verify,auth_auth_user),此时获取到的授权码可在传入的场景通用。
  532. $scope = 'id_verify';
  533. $redirect_uri = 'https://api.qijianshigw.com';
  534. $url = 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?'
  535. . 'app_id=' . $this->config['app_id']
  536. . '&scope=' . $scope
  537. . '&redirect_uri=' . urlencode($redirect_uri)
  538. . '&cert_verify_id=' . $verify_id;
  539. return $url;
  540. }
  541. /**
  542. * 授权URL
  543. *
  544. * @return string
  545. */
  546. public function getOAuth2Url()
  547. {
  548. $redirect_uri = 'https://testapi.qijianshigw.com/avoid-tax/notify/alipay';
  549. $url = 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?'
  550. . 'app_id=' . $this->config['app_id']
  551. . '&scope=auth_base'
  552. . '&redirect_uri=' . urlencode($redirect_uri);
  553. return $url;
  554. }
  555. /**
  556. * 记账本转账到记账本
  557. *
  558. * @param string $out_biz_no 订单号
  559. * @param float $trans_amount 转账金额
  560. * @param string $order_title 转账标题
  561. * @param string $payee_identity 收款记账本ID
  562. * @param string $payee_agreement_no 收款记账本子户开通协议号
  563. * @param string $payer_identity 打款记账本ID
  564. * @param string $payer_agreement_no 打款记账本子户开通协议号
  565. * @param string $remark 转账备注
  566. * @return boolean
  567. */
  568. public function transBookFromBook(
  569. string $out_biz_no,
  570. float $trans_amount,
  571. string $order_title,
  572. string $payee_identity,
  573. string $payee_agreement_no,
  574. string $payer_identity,
  575. string $payer_agreement_no,
  576. string $remark = ''
  577. )
  578. {
  579. $request = new AlipayFundTransUniTransferRequest();
  580. $content = [
  581. // 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。
  582. 'out_biz_no' => $out_biz_no,
  583. // 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  584. 'trans_amount' => $trans_amount,
  585. // 产品码,固定值
  586. 'product_code' => 'SINGLE_TRANSFER_NO_PWD',
  587. // 资金归集,固定值。
  588. 'biz_scene' => 'ENTRUST_ALLOCATION',
  589. // 转账业务的标题,用于在支付宝用户的账单里显示。
  590. 'order_title' => $order_title,
  591. // Participant类型,收款方信息
  592. 'payee_info' => [
  593. // 固定值 ACCOUNT_BOOK_ID
  594. 'identity_type' => 'ACCOUNT_BOOK_ID',
  595. 'identity' => $payee_identity,
  596. 'ext_info' => Json::encode(['agreement_no' => $payee_agreement_no]),
  597. ],
  598. // Participant类型,付款方信息
  599. 'payer_info' => [
  600. // 固定值 ACCOUNT_BOOK_ID
  601. 'identity_type' => 'ACCOUNT_BOOK_ID',
  602. 'identity' => $payer_identity,
  603. 'ext_info' => Json::encode(['agreement_no' => $payer_agreement_no]),
  604. ],
  605. // 业务备注
  606. 'remark' => $remark,
  607. ];
  608. $this->setAopCertClient();
  609. return $this->getResponse($request, $content);
  610. }
  611. /**
  612. * 查询账户余额
  613. *
  614. * @param string $user_id
  615. * @return false|object
  616. */
  617. public function accountQuery(string $user_id)
  618. {
  619. $request = new AlipayFundAccountQueryRequest();
  620. $content = [
  621. 'alipay_user_id' => $user_id,
  622. 'account_type' => 'ACCTRANS_ACCOUNT',
  623. ];
  624. $this->setAopCertClient();
  625. return $this->getResponse($request, $content);
  626. }
  627. /**
  628. * 获取响应值
  629. *
  630. * @param object $request
  631. * @param array $content
  632. * @return boolean|object
  633. */
  634. public function getResponse($request, $content = null)
  635. {
  636. !empty($content) && $request->setBizContent(Json::encode($content));
  637. $result = $this->aopClient->execute($request);
  638. $responseNode = str_replace('.', '_', $request->getApiMethodName()) . '_response';
  639. // 日志
  640. Yii::$app->custom->logs('支付宝合规请求参数: ' . json_encode($content));
  641. Yii::$app->custom->logs('支付宝合规响应参数: ' . json_encode($result->$responseNode));
  642. $resultCode = $result->$responseNode->code;
  643. if (!empty($resultCode) && $resultCode == 10000) {
  644. return $result->$responseNode;
  645. }
  646. return $this->error($result->$responseNode->sub_msg);
  647. }
  648. /**
  649. * 获取响应
  650. *
  651. * @param object $request
  652. * @return array
  653. */
  654. protected function getResponseForOauthToken($request)
  655. {
  656. $result = $this->aopClient->execute($request);
  657. $responseNode = str_replace('.', '_', $request->getApiMethodName()) . '_response';
  658. if (!empty($result->$responseNode)) {
  659. return $result->$responseNode;
  660. }
  661. return $this->error($result->error_response->sub_msg);
  662. }
  663. }