💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
​ 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 "正在跳转")  ​