alipay.fund.trans.toaccount.transfer升级到alipay.fund.trans.uni.transfer

废话不多说了,直接进入正题吧!

之前用的是支付宝的alipay.fund.trans.toaccount.transfer接口,现在支付宝要废弃这个旧接口,改用alipay.fund.trans.uni.transfer这个新接口了,所以必须换掉了,也是为了资金更安全。

//alipay.fund.trans.toaccount.transfer
$aop = new \AopClient ();
$aop->appId = Yii::$app->params['appid'];
$aop->rsaPrivateKey = Yii::$app->params['rsaPrivateKey'];//开发者私钥
$aop->alipayrsaPublicKey = Yii::$app->params['alipayrsaPublicKey'];//支付宝公钥
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='utf-8';
$aop->format='json';
$request = new \AlipayFundTransToaccountTransferRequest();
$request->setBizContent("{" .
  "\"out_biz_no\":\"".$trade_no."\"," .
  "\"payee_type\":\"ALIPAY_LOGONID\"," .
  "\"payee_account\":\"".$account."\"," .
  "\"payee_real_name\":\"".$real_name."\"," .
  "\"amount\":\"".$amount."\"," .
  "\"remark\":\"".date('Y-m-d, H:i').'提现'.$amount."\"" .
"}");
$result = $aop->execute ($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
//成功
}else{
//失败
}

这其中遇到了一些问题后面总结,现在直接把修改后的代码贴过来

//升级为alipay.fund.trans.uni.transfer
$appCertPath = "appCertPublicKey.crt";//app公钥路径
$alipayCertPath = "alipayCertPublicKey_RSA2.crt";//支付宝公钥路径
$rootCertPath = "alipayRootCert.crt";//支付宝根证书路径
$aop = new \AopCertClient ();
$aop->appId = Yii::$app->params['withdraw-appid'];
$aop->rsaPrivateKey = Yii::$app->params['withdraw-rsaPrivateKey'];//开发者私钥
//$aop->alipayrsaPublicKey = Yii::$app->params['withdraw-alipayrsaPublicKey'];//支付宝公钥
$aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='utf-8';
$aop->format='json';
$aop->appCertSN = $aop->getCertSN($appCertPath);
$aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);
$request = new \AlipayFundTransUniTransferRequest();
$request->setBizContent("{" .
  "\"out_biz_no\":\"".$trade_no."\"," .
  "\"trans_amount\":\"".$amount."\"," .
  "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," .
  "\"biz_scene\":\"DIRECT_TRANSFER\"," .
  "\"order_title\":\"提现\"," .
  "\"payee_info\":{" .
  "\"identity\":\"".$account."\"," .
  "\"identity_type\":\"ALIPAY_LOGON_ID\"," .
  "\"name\":\"".$real_name."\"," .
  "}," .
  "\"remark\":\"".date('Y-m-d, H:i').'提现'.$amount."\"" .
"}");
$result = $aop->execute ($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
//成功
}else{
//失败
}

问题1:缺少应用公钥证书序列号

刚开始按https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer 这个文档上面示例进行修改,提示“缺少应用公钥证书序列号”。

原因:新接口现在采用公钥证书模式,公钥证书生成配置可以按照官方教程做。

https://opendocs.alipay.com/open/291/105971/#%E5%85%AC%E9%92%A5%E8%AF%81%E4%B9%A6%E6%96%B9%E5%BC%8F


问题2:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

原因:生成证书之后我忘记替换刚生成的开发者私钥了,生成公钥证书的时候会再次生成开发者私钥和公钥,需要重新替换。