?
源碼:[https://download.csdn.net/download/qq\_34050360/12418202](https://download.csdn.net/download/qq_34050360/12418202 "https://download.csdn.net/download/qq_34050360/12418202")
快速接入地址:?
?[接入準備 | 支付應用](https://opendocs.alipay.com/open/20181012100420932508/quickstart#%E4%B8%8B%E8%BD%BD%E6%9C%8D%E5%8A%A1%E7%AB%AF%20SDK "接入準備 | 支付應用")
首先講集成sdk,直接放sdk下載地址:
[https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=PHP](https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=PHP "https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=PHP")
將下載好的sdk解壓放入extend 里面,目錄層級注意一下,便于后面用 require 引入三個類庫。
?編輯
引入規則:
~~~php
require ROOT_PATH.'/extend/alipay/aop/AopClient.php';
require ROOT_PATH.'/extend/alipay/aop/request/AlipayUserCertifyOpenInitializeRequest.php';
require ROOT_PATH.'/extend/alipay/aop/request/AlipayUserCertifyOpenCertifyRequest.php';
~~~

實例化的時候要加斜杠:
~~~php
$aop = new \AopClient();
~~~

接下來第一步就是驗簽了,坑也隨之而來。
首先確保公鑰私鑰是對的(開發者私鑰就是應用私鑰,支付寶公鑰是支付寶給的,這個自行解決,卡在這里就可以自行放棄了,生活很美好,為什么要寫代碼來折磨自己)
~~~html
1./*'請填寫開發者私鑰去頭去尾去回車,一行字符串'*/
~~~

~~~html
2./*'請填寫支付寶公鑰,一行字符串'*/
~~~

第二步就是支付寶本身的坑,直接上代碼了。
此處數次跟官方技術溝通,被告知,沙箱環境沒有用,無法輔助測試,無語更無奈(沙箱環境:?[支付寶開放平臺-接口調試](https://openhome.alipay.com/platform/demoManage.htm#/alipay.user.certify.open.initialize "支付寶開放平臺-接口調試"))
### 第一步:alipay.user.certify.open.initialize(身份認證初始化服務):
[alipay.user.certify.open.initialize(身份認證初始化服務) | API](https://opendocs.alipay.com/apis/api_2/alipay.user.certify.open.initialize "alipay.user.certify.open.initialize(身份認證初始化服務) | API")
## 請求示例(此處注意有坑:這個帖子一直提醒我,但是被我一直忽略?[https://www.uzhan5.com/post/6504](https://www.uzhan5.com/post/6504 "https://www.uzhan5.com/post/6504"))
~~~php
官方代碼:
$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = 'your app_id';
$aop->rsaPrivateKey = '請填寫開發者私鑰去頭去尾去回車,一行字符串';
$aop->alipayrsaPublicKey='請填寫支付寶公鑰,一行字符串';
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='GBK';
$aop->format='json';
//$request = new AlipayUserCertifyOpenInitializeRequest (); //TODO 官方這個地方寫錯了,應該用下面的代碼才能實現
$request = new AlipayUserCertifyOpenQueryRequest();
$request->setBizContent("{" .
"\"outer_order_no\":\"ZGYD201809132323000001234\"," .
"\"biz_code\":\"FACE\"," .
"\"identity_param\":\"{\\\"identity_type\\\":\\\"CERT_INFO\\\",\\\"cert_type\\\":\\\"IDENTITY_CARD\\\",\\\"cert_name\\\":\\\"收委\\\",\\\"cert_no\\\":\\\"260104197909275964\\\"}\"," .
"\"merchant_config\":\"{\\\"return_url\\\":\\\"xxx\\\"}\"," .
"\"face_contrast_picture\":\"xydasf==\"" .
" }");
$result = $aop->execute ( $request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
echo "成功";
} else {
echo "失敗";
}
~~~

代碼中的坑:
~~~php
$request->setBizContent("{" .
"\"outer_order_no\":\"ZGYD201809132323000001234\"," .
"\"biz_code\":\"FACE\"," .
"\"identity_param\":\"{\\\"identity_type\\\":\\\"CERT_INFO\\\",\\\"cert_type\\\":\\\"IDENTITY_CARD\\\",\\\"cert_name\\\":\\\"收委\\\",\\\"cert_no\\\":\\\"260104197909275964\\\"}\"," .
"\"merchant_config\":\"{\\\"return_url\\\":\\\"xxx\\\"}\"," .
"\"face_contrast_picture\":\"xydasf==\"" .
" }");
~~~

修改后的代碼:
~~~php
$newsigndata=array();
$newsigndata['outer_order_no']=md5(time());
$newsigndata['biz_code']="FACE";
$newsigndata['identity_param']['identity_type']="CERT_INFO";
$newsigndata['identity_param']['cert_type']="IDENTITY_CARD";
$newsigndata['identity_param']['cert_name']="劉洋";
$newsigndata['identity_param']['cert_no']="220623199002030051";
$newsigndata['merchant_config']['return_url']="http://kmxlm-api.maoln.com/api/Reflect/reflectList";
$newsigndata['face_contrast_picture']="xydasf==";
$tosign=json_encode($newsigndata);
$request->setBizContent($tosign);
~~~

~~~bash
{"alipay_user_certify_open_initialize_response":{"code":"40004","msg":"Business Failed","sub_code":"unknown-sub-code","sub_msg":"未知的錯誤碼UNKNOWN_ERROR"},"sign":"GNjUpr/i4iCd0mPE5LgdIuNXBY0D6QJfAx241kGrWz3kvtzCeu7+izZs51iN1aGSgrdg2pQcQbsk7taGG7WxUquHryiV4RIZhZ3CQXNdpZeOWibVd8DAINviKLYlVyxZrHnV2rpxCFPHdRtlSiFffkqlqiEMwTgPT7a8pC65ESo="}
~~~

### 上面是之前第一步一直沒繞過的報錯,終究是解決了。
到此驗簽通過(通過之前一直報錯40004未知錯誤,就是驗簽失敗,也是上面的官方代碼所致,在此順便貼一下前面沒走通之前的一個報錯),進入第二個環節:
### ?第二步:alipay.user.certify.open.certify(身份認證開始認證)
[alipay.user.certify.open.certify(身份認證開始認證) | API](https://opendocs.alipay.com/apis/api_2/alipay.user.certify.open.certify "alipay.user.certify.open.certify(身份認證開始認證) | API")
不要相信沙箱環境,沒意義。直接進入開干,坑也來了。
跟第一步里面坑一樣,json傳需要重新拼接
~~~php
$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = 'your app_id';
$aop->rsaPrivateKey = '請填寫開發者私鑰去頭去尾去回車,一行字符串';
$aop->alipayrsaPublicKey='請填寫支付寶公鑰,一行字符串';
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='GBK';
$aop->format='json';
$request = new AlipayUserCertifyOpenCertifyRequest ();
$request->setBizContent("{" .
"\"certify_id\":\"OC201809253000000393900404029253\"" .
" }");
$result = $aop->pageExecute ( $request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
echo "成功";
} else {
echo "失敗";
}
~~~

跳坑操作:
~~~php
$data=array();
$data['certify_id']=$certify_id;
$tosign=json_encode($data);
$request->setBizContent($tosign);
~~~

雖然距離成功不遠,但是支付寶會讓你感到絕望,你執行后的結果是這樣的,如下所示:
?編輯
### **驚不驚喜意不意外**
支付寶讓你永遠不要放棄,其實在這個頁面之前你還會看到一個字符串被打印出來,1200多個字符。抱著懷疑的態度去打印接收參數:
?編輯
結果如下所示:
~~~html
<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST'><input type='hidden' name='biz_content' value='{"certify_id":"f496ac867cdfc08f25b5c095ca29a739"}'/><input type='hidden' name='app_id' value='2021001160633987'/><input type='hidden' name='version' value='1.0'/><input type='hidden' name='format' value='json'/><input type='hidden' name='sign_type' value='RSA2'/><input type='hidden' name='method' value='alipay.user.certify.open.certify'/><input type='hidden' name='timestamp' value='2020-05-13 23:45:14'/><input type='hidden' name='alipay_sdk' value='alipay-sdk-php-20200415'/><input type='hidden' name='charset' value='UTF-8'/><input type='hidden' name='sign' value='OTnUvXOrqwqkAwfjH0xbKXzlTOLeGWjPPXsDRe9m5msitI/67Poyc2JXaRYwahNFqiqs3MqI2MyUggdQdNBsnc6sxPzqYQxEwSGmHzZI9aCJnpAC5RNC6bkdxe/iyI72dYyuO5XN7zVIEiWn++cQzOIGKuUSQsMqXNRVa/8O/EIcZdvKNB2d9EDSyInr5Xc/HGoGB79bMl2cLVwUaOMU/OsqcJ1kh1wAcSVYmDb+Gr6XFGpOItW3oPpb70B57UU7xTA8Yco2BzdlTOfoOy4KZMsvF0vZc7QO7gkJHJF02CHSfYFtwZA7o6qbWAOalnjxjMiSYnBinnihcxgQnDxB4Q=='/><input type='submit' value='ok' style='display:none;''></form><script>document.forms['alipaysubmit'].submit();</script>
~~~

轉碼后的結果:
~~~html
<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST'>
<input type='hidden' name='biz_content' value='{"certify_id":"f496ac867cdfc08f25b5c095ca29a739"}'/>
<input type='hidden' name='app_id' value='2021001160633987'/>
<input type='hidden' name='version' value='1.0'/>
<input type='hidden' name='format' value='json'/>
<input type='hidden' name='sign_type' value='RSA2'/>
<input type='hidden' name='method' value='alipay.user.certify.open.certify'/>
<input type='hidden' name='timestamp' value='2020-05-13 23:45:14'/>
<input type='hidden' name='alipay_sdk' value='alipay-sdk-php-20200415'/>
<input type='hidden' name='charset' value='UTF-8'/>
<input type='hidden' name='sign' value='OTnUvXOrqwqkAwfjH0xbKXzlTOLeGWjPPXsDRe9m5msitI/67Poyc2JXaRYwahNFqiqs3MqI2MyUggdQdNBsnc6sxPzqYQxEwSGmHzZI9aCJnpAC5RNC6bkdxe/iyI72dYyuO5XN7zVIEiWn++cQzOIGKuUSQsMqXNRVa/8O/EIcZdvKNB2d9EDSyInr5Xc/HGoGB79bMl2cLVwUaOMU/OsqcJ1kh1wAcSVYmDb+Gr6XFGpOItW3oPpb70B57UU7xTA8Yco2BzdlTOfoOy4KZMsvF0vZc7QO7gkJHJF02CHSfYFtwZA7o6qbWAOalnjxjMiSYnBinnihcxgQnDxB4Q=='/>
<input type='submit' value='ok' style='display:none;'>
</form>
<script>document.forms['alipaysubmit'].submit();</script>
~~~

看清了沒,亮瞎了雙眼,不按正常套路出牌,可能官方給的示例正常返回值都是java的操作,php直接就是這個了,后面我們在別的地方解析出了人家掃碼的那個碼的鏈接如下:
[出錯了-404](https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-java-4.5.0.ALL&app_id=2018040102484116&biz_content=%7B%22certify_id%22%3A%223f3523824cc8ed0c9c569d0e5973fa19%22%7D&charset=GBK&format=json&method=alipay.user.certify.open.certify&sign=BYqQIh7r3IdT6%2B5cz7Dc39xc7DG%2BOPLUi0gO5ejYpSx1YX11j0zZcAdUiF0py6qP7loJj8yK3UqdBo0ZvxxdsWJrIYdXPz6pYqUd8iHa74aTwTqY2jmRd3sflKY48c%2FlHhbDpEDZuDIz1dygf%2FiaqfF8j%2BtSTw48uBSRbbh0tjPOkGQhmSpgCBa3ZSCywEhle%2ByuWbEA9linuEAyST3bLEeL%2BaxkPQNdZYk%2Bfvbd5cWK%2Byp3GHW8zfDCbeaMcFynTXnESPo27uSRBGGmhwe7sPzmuLBxjDQzVYeqbrkihf%2FD36fQxanIHEtJlR%2FLsyRyymwBa37CiYTQsN9cyQ1i0g%3D%3D&sign_type=RSA2×tamp=2020-05-13+22%3A58%3A39&version=1.0 "出錯了-404")
以為自己可以了,其實是越走越遠。
我把上面的表單的參數一個一個填寫到鏈接里面,再生成二維碼,試了20次,所有的結局都是悲壯的。
在下班之前最后腦洞一開,**突然想到把這個html直接放到頁面里面,將頁面鏈接生成一個二維碼,再用支付寶掃碼,最后通了**。11:55分,下班回家。
夢里依然是這些代碼,感覺棒棒的。
最后附上控制器跟頁面以及報錯日志的文件在附件。
點擊鏈接加入群聊【ThinkPHP56小功能】:[正在跳轉](https://jq.qq.com/?_wv=1027&k=Z0c641WP "正在跳轉")?
?
- 支付寶身份驗證接口踩坑實錄-PHP(基于ThinkPHP5)(第二版更新中)
- 抖音小程序開發之授權登錄+支付寶支付+微信支付(ThinkPHP5-第三版修訂中)
- TP5小知識點錦集(長期更新)
- PHP 二維碼生成+識別
- 高德地圖點聚合點擊事件以及內容渲染
- ThinkPhP5使用phpexcle 導出數據(復制粘貼就可使用)
- Fastadmin微信小程序授權登錄+獲取手機號插件
- PHP -AES-128-CBC位加密解密
- PHP-Rsa分段加密解密(ThinkPHP5)
- PHP大轉盤抽獎代碼片段
- Fastadmin 項目上線關閉調試模式注意事項(記一次require-table.js修改事件)
- ThinkPHP5條件查詢FIND_IN_SET正反使用
- ThinkPhP5整合微信小程序訂閱消息
- think-queue處理延時任務事件
- ThinkPHP5 生成二維碼
- Python3定時監控指定文件內容變換-(增加多行,遍歷每行進行邏輯分析處理)
- Python3開發聲光報警器監控觸發報警
- ThinkPHP5下載文件流到本地
- 百度鷹眼抽軌跡集合稀算法&縮放比例調整顯示靜態圖(ThinkPHP5)
- PHP 導出Excle
- Fastadmin 自定義Tab選項卡(B表的條件查詢A表的數據,在A表里面加B表的參數作為選項卡)
- Fastadmin 修改url組件跳轉為復制功能
- 微信H5分享好友跟朋友圈-基于Easywechat
- Python3抓取監控日志文件關鍵詞跟內容變化修正版
- ThinkPHP5上傳圖片壓縮處理-(解決IOS拍照上傳旋轉90度問題)最近更新2021年12月9日11:35:07
- 二維數組根據‘key’分組為新的三維數組
- ThinkPHP5 成功部署Workerman 運行示例
- Fastadmin框架TOKEN的使用
- ThinkPHP5 -微信小程序訂閱消息開發-插件(插件基于fastadmin開發)
- ThinkPHP5-文本轉義emoji表情
- ThinkPHP5 自定義命令行處理 監聽Redis key失效觸發回調事件,實現延遲任務 實現自動取消訂單,自動完成訂單
- Fastadmin插件Shopro商城里面短信插件修改為騰訊云短信插件步驟
- Fastadmin框架自定義搜索操作流程
- ThinkPHP5 處理 微信小程序內容安全審核
- Fastadmin自定義快捷搜索之模糊搜索關聯他表
- php根據年月獲取指定月份天數及日期數組的方法
- PHP構造函數使用校驗token
- 基于ThinkPHP5&Redis騰訊云短信驗證碼注冊登錄基礎業務邏輯代碼整合
- ThinkPHP 解決跨域問題
- 支付寶沙箱環境測試支付(好久沒做都忘了,寫個博客比較省事)
- ThinkPHP5生成抖音小程序帶參數二維碼
- ThinkPHP5導入Excle-簡單絲滑
- PHP生成帶參數的小程序二維碼
- ThinkPHP5成功調通IOS蘋果支付
- swoole寫聊天室,簡單粗暴
- 微信小程序內容安全鑒別的時候,不成功因為沒有轉碼
- Fastadmin 后臺Excle文件上傳(更新新增功能)
- Lnmp 配置thinkphp5 Nginx基礎設置,包含http+https配置
- 通過經緯度獲取數據庫信息自動計算地址距離遠近
- 二維數組根據某個字段排序
- PHP二維數組去重,最簡單的方法
- TP5微信redis列隊群發模板消息Sendmsg
- PHP檢測是否關注公眾號,親測可用
- 小程序推廣分享帶參數二維碼生成
- 基于ThinkPHP5微信H5授權登錄獲取用戶信息(改進版)
- php過濾微信昵稱中的表情
- Socket.io