<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ? 1.注冊賬號,綁定開發者??[字節跳動開發者文檔](https://microapp.bytedance.com/dev/cn/mini-app/introduction/plug-in/%E3%80%90%E5%BF%85%E8%AF%BB%E3%80%91%E6%B5%81%E7%A8%8B%E6%8C%87%E5%BC%95 "字節跳動開發者文檔")?? 2.申請應用,記得支付寶跟微信支付都勾選上,不然后面有的是問題。 3.字節跳動開發者社區?[字節小程序開發者平臺 - Creating future with excellent developers](https://microapp.bytedance.com/ "字節小程序開發者平臺 - Creating future with excellent developers")? 4.開發工具?[下載地址](https://microapp.bytedance.com/dev/cn/mini-app/develop/developer-instrument/development-assistance/mini-app-developer-instrument "下載地址") 5.微信H5支付文檔,需要看,因為串??[https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15\_4](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4 "https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4"),原因如下所示,返回的是一個html,需要做截取。支付用的是github里star最高的sdk??[https://github.com/yansongda/pay](https://github.com/yansongda/pay "https://github.com/yansongda/pay") ~~~php $pay = Fastapy::wechat($config)->wap($payData)->getContent(); // laravel 框架中請直接 return $wechat->wap($order) $reg2="/href=\"([^\"]+)/";//獲取href中的值 preg_match_all($reg2,$pay,$aarray); // $cs=str_replace("amp;","",$aarray[1]); return $cs=str_replace("amp;","",$aarray[1])[0]; ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 6.tt.pay 接入優化 RoadMap??[tt.pay 接入優化 RoadMap](https://forum.microapp.bytedance.com/mini-app/posts/5eb6e6c499b677024b9b6b2a "tt.pay 接入優化 RoadMap") 7.申請開通支付??[https://microapp.bytedance.com/dev/cn/mini-app/develop/api/open-interface/payment/mini-app-pay-plugin-reference/application-for-payment](https://microapp.bytedance.com/dev/cn/mini-app/develop/api/open-interface/payment/mini-app-pay-plugin-reference/application-for-payment "https://microapp.bytedance.com/dev/cn/mini-app/develop/api/open-interface/payment/mini-app-pay-plugin-reference/application-for-payment")? ?特別強調:微信H5支付這塊需要處理的地方如下標紅所示,所以這個地方不僅僅是項目本身的域名需要配置,還需要添加下面這域名,也就是添加兩個域名才可以繼續開發。 **H5 支付域名:將以下域名配置到微信商戶平臺中的 ?H5 支付域名中? ?snssdk.com** 8.抖音SDK 下載??OtkurBiz 這個包放到extend 里面就好了? ?網盤鏈接:https://pan.baidu.com/s/1hOPkQMv9rmcvnn2FL\_ajXw? 提取碼:e0dd 9\. 支付使用的sdk???[https://github.com/yansongda/pay](https://github.com/yansongda/pay "https://github.com/yansongda/pay")? ?整合了一個附帶命名空間的sdk ,也可以直接放在extend 目錄就可以了?鏈接:https://pan.baidu.com/s/1Avvz3LOrmg7xbLf2SaMUTA? ?提取碼:4ftg 10.支付寫完了,還要給前端寫一個查單的接口,如下所示: ~~~php // PHP訂單查詢 public function ckorder(){ $order=$this->request->post('out_trade_no'); $order = [ 'out_trade_no' =>$order, ]; $config = $this->dywxConfig(); $result = Fastapy::wechat($config)->find($order); $c=json_decode($result,true); if(isset($c['return_code']) && $c['return_code'] == 'SUCCESS' && $c['result_code'] == 'SUCCESS'){ if($c['trade_state']=='NOTPAY'){ return json(['code'=>400,'message'=>$c['trade_state_desc']]); }else if($c['trade_state']=='SUCCESS'){ return json(['code'=>200,'message'=>$c['trade_state_desc']]); }else{ return json(['code'=>400,'message'=>'支付失敗']); } }else{ if(isset($c['result_code']) && $c['result_code']=='FAIL'){ return json(['code'=>400,'message'=>$c['err_code_des']]); }else{ return json(['code'=>400,'message'=>'支付失敗']); } } } ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 使用上面提到的支付SDK,需要**注釋一段代碼**,不然會把報錯直接拋出來:yansongda\\pay\\Gateways\\Wechat\\Support? ?大概在153行,或者搜索這個方法? ?requestApi($endpoint, $data, $cert = false) ~~~php if (!isset($result['return_code']) || $result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') { throw new GatewayException( 'Get Wechat API Error:'.($result['return_msg'] ?? $result['retmsg']).($result['err_code_des'] ?? ''), $result, 20000 ); } ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") Bake:查單返回的數據有以下三種格式,所以都要處理: ~~~php { "data": { "return_code": "SUCCESS", "return_msg": "OK", "appid": "wx7e0e111f105ff49c", "mch_id": "1471311102", "device_info": [], "nonce_str": "p5Mp2tGnfbWsCIOM", "sign": "0093DCAF5A7D1640FC7EF3A278887EA1", "result_code": "SUCCESS", "total_fee": "2", "out_trade_no": "202006179956484859248", "trade_state": "NOTPAY", "trade_state_desc": "訂單未支付" } } { "data": { "return_code": "SUCCESS", "return_msg": "OK", "appid": "wx7e01112f105ff49c", "mch_id": "1471118102", "nonce_str": "Cuin0FHZpDsKIjjV", "sign": "792F38306E56CF0B4215A587F1AE6A7D", "result_code": "SUCCESS", "openid": "oYr-Ijkd7VcUBUoL_-kl0cDwyJ1Y", "is_subscribe": "N", "trade_type": "MWEB", "bank_type": "OTHERS", "total_fee": "2", "fee_type": "CNY", "transaction_id": "4200000576202006182065094801", "out_trade_no": "202006184855994944338", "attach": [], "time_end": "20200618095413", "trade_state": "SUCCESS", "cash_fee": "2", "trade_state_desc": "支付成功", "cash_fee_type": "CNY" } } { "data": { "return_code": "SUCCESS", "return_msg": "OK", "appid": "wx7e0ef111105ff49c", "mch_id": "1471311102", "nonce_str": "y2kFk1jF4d9Esr54", "sign": "29B8CD7257030A1E6A4B5F51A344FEC6", "result_code": "FAIL", "err_code": "ORDERNOTEXIST", "err_code_des": "訂單不存在" } } ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 11.微信抖音支付的坑,**單位是1分錢,乘以100的時候可能會出現無限長的小數點**,需要進行以下處理,此處案例暫用`intval(round())`?解決,先把內存中小數點后的數值四舍五入,再轉化成整數。 ~~~php $data["total_amount"]=intval(round($realpaymoney*100)); ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") **踩坑續集更新中...? 不懂的可以直接私信我,解決問題一杯咖啡就可以了** **拉起授權登錄后端核心代碼**:(改進版請往下看) ~~~php /*抖音用戶登錄*/ public function dylogin(){ $app=new \OtkurBiz\ByteDance\Factory(); $recode=request()->param(); $code=$recode['code']; $config = [ 'app_id' => 'tt4a883c***d5a2271f', 'app_secret' => '420d0ae39709943******1a595e9a97017d09378', ]; $cret=$app->make($config)->auth->session($code); if($cret['error']==3){ return json(['code'=>400,'message'=>$cret['message']]); }else{ $ck=Db::name('newuser')->where('openid',$cret['openid'])->find(); if(empty($ck)){ $int=array(); $int['openid'] = $cret['openid']; $int['createtime'] = time(); $int['type'] = '1'; $int['spcode'] = $this->randkeys(8); Db::name('newuser')->insert($int); } return json(['code'=>200,'message'=>'success','data'=>['openid'=>$cret['openid'],'session_key'=>$cret['session_key']]]); } } /*抖音獲取用戶信息-帶分銷參數*/ public function newdysaveUserInfo(){ $app=new \OtkurBiz\ByteDance\MiniProgram\Encryptor(); $encryptedData = request()->param('encryptedData'); $iv = request()->param('iv'); $session = request()->param('sessionKey'); $param=request()->param(); if( empty($encryptedData) || empty($iv) || empty($session)) { return json(['code'=>-1,'缺少參數']); } $cret=$app->decryptData($session, $iv, $encryptedData); if(isset($cret['nickName'])){ $ck=Db::name('newuser')->where('openid',$cret['openId'])->find(); if(!empty($ck) && empty($ck['headimg'])){ $int=array(); if(!$ck['upcode']){ if(isset($param['upcode'])){ if($param['upcode']){ $int['upcode']= $param['upcode']; } } }else if($ck['upcode']=='999999'){ if(isset($param['upcode'])){ if($param['upcode']){ $int['upcode']= $param['upcode']; } } } $int['nickname']= $cret['nickName']; $int['province'] = $cret['province']; $int['country'] = $cret['country']; $int['city'] = $cret['city']; $int['headimg'] = $cret['avatarUrl']; // $int['unionId'] = $result['unionId']; Db::name('newuser')->where('openid',$cret['openId'])->update($int); } $item=Db::name('newuser')->where('openid',$cret['openId'])->find(); $item['avatar_image']=$item['headimg']; $item['nickname']=$item['nickname']; return json(['code'=>200,'data'=>$item,'msg'=>'登陸成功']); }else{ return json(['code'=>400,'msg'=>'用戶信息更新失敗']); } } ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") **拉起授權登錄后端核心代碼(優化版本)**:下面是改進版本,上面的老版本在遷移項目的時候一直提示code失效 ? ~~~php ### 下面是改進版本,上面的老版本在遷移項目的時候一直提示code失效 public function https_request($url,$data = null){ if(function_exists('curl_init')){ $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; }else{ return false; } } public function newdylogin(){ $recode=request()->param(); $code=$recode['code']; $config = [ 'appid' => get_addon_config("baseconfig")['dyAppID'], 'secret' => get_addon_config("baseconfig")['dyAppSecret'], 'code' => $code, ]; $str=http_build_query($config); $url='https://developer.toutiao.com/api/apps/jscode2session?'.$str; $cret=$this->https_request($url); $cret=json_decode($cret,true); if($cret){ if($cret['error']==3){ return json(['code'=>400,'message'=>$cret['message'],'data'=>$cret,'config'=>$config,'post'=>$recode]); }else{ $ck=Db::name('newuser')->where('openid',$cret['openid'])->find(); if(empty($ck)){ $int=array(); $int['openid'] = $cret['openid']; $int['createtime'] = time(); $int['type'] = '1'; $int['appid'] =get_addon_config("baseconfig")['dyAppID']; $int['spcode'] = $this->randkeys(8); Db::name('newuser')->insert($int); } return json(['code'=>200,'message'=>'success','data'=>['openid'=>$cret['openid'],'session_key'=>$cret['session_key']]]); } } } ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") **拉起支付后端簽名代碼**: [常見問題](https://microapp.bytedance.com/dev/cn/mini-app/develop/api/open-interface/payment/mini-app-pay-plugin-reference/faq "常見問題")? ?[tt.pay](https://microapp.bytedance.com/dev/cn/mini-app/develop/api/open-interface/payment/tt.pay "tt.pay")? ? ? merchant\_id、app\_id、uid? 這幾個參數是在抖音應用后臺就可以拿到 ![](https://img-blog.csdnimg.cn/20200617183156851.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDUwMzYw,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動")?編輯 ~~~php /*抖音微信下單簽名*/ // dywxuporder是通過微信H5下單方法拿到的微信支付的串,這個串因為是H5支付,不能直接訪問,是一個深度鏈接,需要進行一下切割,拿到的 是一個網頁HTML,在里面分割出來。在上文中第五點已經說到了這個 public function dywxsign(){ $data=array(); $orderid=Random::build('alnum',20); $time=time(); $aliurl=""; // $aliurl=$this->bendidypay($orderid,strval($time)); $wxurl=$this->dywxuporder($orderid,strval($time)); // $data["alipay_url"]=""; $data["alipay_url"]=$aliurl; $data["app_id"]="8001****7636"; $data["body"]="wudi test"; $data["currency"]="CNY"; $data["merchant_id"]="190****699"; $data["notify_url"]="https://tp-pay.snssdk.com/cashdesk/test/paycallback"; $data["out_order_no"]=$orderid; $data["payment_type"]="direct"; $data["product_code"]="pay"; $data["sign_type"]="MD5"; $data["subject"]="wudi test"; $data["timestamp"]=strval($time); $data["total_amount"]=1; $data["trade_time"]=strval($time); $data["trade_type"]="H5"; $data["uid"]="800****97636"; $data["valid_time"]="1800"; $data["version"]="2.0"; $data["wx_type"]="MWEB"; $data["wx_url"]=$wxurl; // $data["wx_url"]=""; // $data["wx_url"]="https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx25161122572189727ea14cfd1832451500&package=2746219290"; $data["risk_info"]="{\"ip\":\"127.0.0.1\"}"; $str=""; foreach ($data as $k=>$v){ if( $k=='risk_info' || $v=='') continue; $c='&'.$k.'='.$v; $str.=$c; } $newstr=substr($str,1); $sign=md5(substr($str,1).'emq4mx2****9iz0jmha0z4yjbjqdan6u6qr3iy9s'); return json(['code'=>200,'newstr'=>$newstr,'sign'=>$sign,'data'=>$data]); } /*抖音微信下單處理*/ public function dywxuporder($orderid,$time){ /*提交表單存數據庫*/ /*沒有驗簽*/ /*1.所有傳參直接插入*/ /*用戶openid*/ $info=Db::name('newuser')->find(7); /*openid_wx*/ // $info=Db::name('newuser')->find($post['newuser_id']); /*openid_wx*/ /*用戶上級*/ /* upcode*/ /*創建時間*/ /*傭金*/ /*TODO 暫時沒有分銷這塊邏輯*/ $post['orderid']=$orderid; $post['createtime']=$time; $post['upcode']=$info['upcode']; $btn=Db::name('ororder')->insert($post); if($btn){ $preData=array(); $preData['money']=0.02; // $preData['money']=$post['price']; $preData['ordersn']=$orderid; $cc=$this->dywxprocessPay('dywxpucallback',$preData,$body = 'dywudi test'); // return json(['code'=>200,'data'=>$cc]); return $cc; } } /** * 抖音微信統一下單 * @param $action 回調方法 * @param $money 訂單金額 * @param $ordersn 訂單號 * @param $openid openid * @return \yansongda\supports\Collection 支付成功攜帶驗簽的數據,客戶端使用該數據拉起支付頁面 */ public function dywxprocessPay($action,$preData,$body = 'dywudi test'){ $total_fee = $preData['money'] * 100; $payData = [ 'out_trade_no' => $preData['ordersn'], 'total_fee' => $total_fee, // **單位:分** 'body' => $body, // 'subject' => 'dywudi test', ]; $config = $this->dywxConfig($action); // $pay = Fastapy::wechat($config)->wap($payData)->send(); // laravel 框架中請直接 return $wechat->wap($order) $pay = Fastapy::wechat($config)->wap($payData)->getContent(); // laravel 框架中請直接 return $wechat->wap($order) $reg2="/href=\"([^\"]+)/";//獲取href中的值 preg_match_all($reg2,$pay,$aarray); // $cs=str_replace("amp;","",$aarray[1]); return $cs=str_replace("amp;","",$aarray[1])[0]; // return json(['code'=>200,'data'=>str_replace("amp;","",$aarray[1])]); // laravel 框架中請直接 return $wechat->wap($order) } /*下面是微信支付*/ public function dywxConfig($action=''){ $baseurl = $this->request->domain(); $config = [ 'app_id' => 'wx9a59*******2f979', // 公眾號 APPID // 'app_id' => 'wx7e0*******5ff49c', // 公眾號 APPID 'mch_id' => '148*******402', // 'mch_id' => '147*******02', 'key' => 'xiaobudianc********97907064518', // 'key' => 'mdasdasioho*******dslkdhashdsahd', 'notify_url' => $baseurl.'/minapp/paybk/'.$action,//支付回調url 'cert_client' => './cert/apiclient_cert.pem', // optional, 退款,紅包等情況時需要用到 'cert_key' => './cert/apiclient_key.pem',// optional, 退款,紅包等情況時需要用到 'log' => [ // optional 'file' => './logs/wechat.log', 'level' => 'info', // 建議生產環境等級調整為 info,開發環境為 debug 'type' => 'single', // optional, 可選 daily. 'max_file' => 30, // optional, 當 type 為 daily 時有效,默認 30 天 ], 'http' => [ // optional 'timeout' => 5.0, 'connect_timeout' => 5.0, // 更多配置項請參考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html) ], // 'mode' => 'dev', ]; return $config; } ~~~ ![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動") 拉起支付+授權登錄 前端代碼測試包:?鏈接:https://pan.baidu.com/s/1K6yEtxCUtY07GnfdFdOgxA? ? 提取碼:sig2?? ![](https://img-blog.csdnimg.cn/20200616095226388.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDUwMzYw,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點擊并拖拽以移動")?編輯 點擊鏈接加入群聊【ThinkPHP56小功能】:[正在跳轉](https://jq.qq.com/?_wv=1027&k=Z0c641WP "正在跳轉")? ?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看