php获取小程序码的实现代码(B类接口)
吾爱主题
阅读:143
2021-10-18 14:36:00
评论:0
效果图
生成小程序码的php代码
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | public function qrcode(){ $member_id = session( 'id' ); if ( empty ( $member_id )) $this ->error( '请先登录' ); //推广二维码 $member = model( 'member' )->where( 'id' , $member_id )->find(); if ( $member [ 'is_share' ] && $member [ 'share_qrcode' ]){ $litpic = $member [ 'share_qrcode' ]; } else { header( 'content-type:image/jpg' ); //加载速度快 // 生成小程序码 $wechatobj = new \wechat(); //这是个类 这里有小程序appid和密码 $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" . $wechatobj ->getaccesstoken(); $page = 'pages/index/index' ; $scene = 'share_id=' . $member_id ; $path = './upload/qrcode/' . $member_id . '.jpg' ; $postdata = array (); $postdata [ 'page' ] = $page ; $postdata [ 'scene' ] = $scene ; $data = json_encode( $postdata ); $result = $this ->api_notice_increment( $url , $data ); $image = 'data:image/jpg;base64,' . base64_encode ( $result ); $other_result = $result ; $file = fopen ( $path , "w" ); //打开文件准备写入 fwrite( $file , $other_result ); //写入 fclose( $file ); //关闭 //return $result; $litpic = $path ; $litpic = ltrim( $litpic , '.' ); //写入数据库 $member ->save([ 'share_qrcode' => $litpic , 'is_share' =>1]); } //推广人数 $path_member = model( 'member' )->where( 'path' , $member_id )->field( 'id,name,litpic,add_time' )->select(); $path = []; foreach ( $path_member as $v ){ $v [ 'add_time' ] = date ( 'y-m-d h:i:s' , $v [ 'add_time' ]); $path [] = $v ; } $data = [ 'litpic' => $litpic , 'path' => $path , ]; return json( $data ); } public function api_notice_increment( $url , $data ){ //return $data; $curl = curl_init(); // 启动一个curl会话 //$header = "accept-charset: utf-8"; curl_setopt( $curl , curlopt_url, $url ); // 要访问的地址 curl_setopt( $curl , curlopt_ssl_verifypeer, false); // 对认证证书来源的检测 curl_setopt( $curl , curlopt_ssl_verifyhost, false); // 从证书中检查ssl加密算法是否存在 curl_setopt( $curl , curlopt_httpheader, array ( 'expect:' )); //解决数据包大不能提交 curl_setopt( $curl , curlopt_followlocation, 1); // 使用自动跳转 curl_setopt( $curl , curlopt_autoreferer, 1); // 自动设置referer curl_setopt( $curl , curlopt_post, 1); // 发送一个常规的post请求 curl_setopt( $curl , curlopt_postfields, $data ); // post提交的数据包 curl_setopt( $curl , curlopt_timeout, 30); // 设置超时限制防止死循 curl_setopt( $curl , curlopt_header, 0); // 显示返回的header区域内容 curl_setopt( $curl , curlopt_returntransfer, 1); // 获取的信息以文件流的形式返回 $tmpinfo = curl_exec( $curl ); // 执行操作 if (curl_errno( $curl )) { echo 'errno' .curl_error( $curl ); } curl_close( $curl ); // 关键curl会话 return $tmpinfo ; // 返回数据 } function api_notice_increment( $url , $data ) { $curl = curl_init(); $a = strlen ( $data ); $header = array ( "content-type: application/json; charset=utf-8" , "content-length: $a" ); curl_setopt( $curl , curlopt_url, $url ); curl_setopt( $curl , curlopt_ssl_verifypeer, false); curl_setopt( $curl , curlopt_ssl_verifyhost, false); curl_setopt( $curl ,curlopt_post,1); curl_setopt( $curl ,curlopt_postfields, $data ); curl_setopt( $curl , curlopt_header, 0); curl_setopt( $curl , curlopt_returntransfer, 1); $res = curl_exec( $curl ); curl_close( $curl ); return $res ; } |
小程序端获取二维码中带的参数
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 生命周期函数--监听页面加载 */ onload: function (option) { console.log(option) if (option.id){ this.setdata({ id: option.id }); this.data.business_id = option.id; this.loaddata(option.id); } //接受二维码扫码并获取二维码中的参数 if (option.scene){ const ids = decodeuricomponent(option.scene).split( '=' )[1]; console.log( "ids" , ids); this.setdata({ id: ids }); this.data.business_id = ids; this.loaddata(ids); } }, |
补充上wechat类
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 | <?php class wechat { // +---------------------------------------------------------------------- // | 参数 // +---------------------------------------------------------------------- public $table ; public $where_web ; public $wechatid ; public $wechattoken ; public $wechatappid ; public $wechatappsecret ; public $wechatmchid ; public $wechatprivatekey ; public $wechataccesstoken ; public $wechataccesstokentime ; public $wechatjsapiticket ; public $wechatjsapitickettime ; // +---------------------------------------------------------------------- // | 自动加载 // +---------------------------------------------------------------------- public function __construct() { //测试 /*$this->wechatid = 1; $this->wechatappid = 'wx1161dbcdd18c52c2'; $this->wechatappsecret = 'f373410716a198feb462182c69facb8a'; $this->wechatmchid = 1493574822; $this->wechatprivatekey = md5(123); */ //客户appid $this ->wechatid = 1; $this ->wechatappid = 'your appid' ; $this ->wechatappsecret = 'your appsecret' ; $this ->wechatmchid = 商户号; $this ->wechatprivatekey = '私钥' ; /* $this->wechattoken = $wechatinfo['wechat_token']; $this->wechataccesstoken = $wechatinfo['wechat_access_token']; $this->wechataccesstokentime = $wechatinfo['wechat_access_token_time']; $this->wechatjsapiticket = $wechatinfo['wechat_jsapi_ticket']; $this->wechatjsapitickettime = $wechatinfo['wechat_jsapi_ticket_time']; */ } // +---------------------------------------------------------------------- // | 获取access_token // +---------------------------------------------------------------------- public function getaccesstoken(){ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $this ->wechatappid. '&secret=' . $this ->wechatappsecret; $data = $this -> curlget( $url ); $access_token = $data [ 'access_token' ]; $expires_in = $data [ 'expires_in' ]; $save [ 'wechat_access_token' ] = $access_token ; $save [ 'wechat_access_token_time' ] = ( $expires_in +time())-360; $this -> wechataccesstoken = $save [ 'wechat_access_token' ]; $this -> wechataccesstokentime = $save [ 'wechat_access_token_time' ]; return $access_token ; } // +---------------------------------------------------------------------- // | 获取access_token // +---------------------------------------------------------------------- public function getjsapiticket(){ $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $this -> getaccesstoken(). '&type=jsapi' ; $data = $this -> curlget( $url ); $jsapi_ticket = $data [ 'ticket' ]; $expires_in = $data [ 'expires_in' ]; $save [ 'wechat_jsapi_ticket' ] = $jsapi_ticket ; $save [ 'wechat_jsapi_ticket_time' ] = ( $expires_in +time())-360; $this ->wechatjsapiticket = $save [ 'wechat_jsapi_ticket' ]; $this ->wechatjsapitickettime = $save [ 'wechat_jsapi_ticket_time' ]; return $jsapi_ticket ; } // +---------------------------------------------------------------------- // | 获取signature // +---------------------------------------------------------------------- public function getsignature( $appid , $timestamp , $noncestr , $url ) { $jsapi_ticket = $this -> getjsapiticket(); $string1 = "jsapi_ticket={$jsapi_ticket}&noncestr={$noncestr}×tamp={$timestamp}&url={$url}" ; $signature = sha1( $string1 ); return $signature ; } // +---------------------------------------------------------------------- // | 获取createnoncestr // +---------------------------------------------------------------------- public function getcreatenoncestr( $length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789" ; $str = "" ; for ( $i = 0; $i < $length ; $i ++) { $str .= substr ( $chars , mt_rand(0, strlen ( $chars ) - 1), 1); } return $str ; } // +---------------------------------------------------------------------- // | 下载本地 // +---------------------------------------------------------------------- public function curldownload( $url , $name ) { $ch = curl_init (); curl_setopt ( $ch , curlopt_customrequest, 'get' ); curl_setopt ( $ch , curlopt_ssl_verifypeer, false ); curl_setopt ( $ch , curlopt_url, $url ); ob_start (); curl_exec ( $ch ); $return_content = ob_get_contents (); ob_end_clean (); $return_code = curl_getinfo ( $ch , curlinfo_http_code ); $filename = "uploads/card/{$name}" ; $fp = @ fopen ( $filename , "a" ); fwrite( $fp , $return_content ); // 关闭url请求 curl_close( $ch ); $url = "/uploads/card/{$name}" ; return "{$url}" ; } // +---------------------------------------------------------------------- // | get请求 // +---------------------------------------------------------------------- public function curlget( $url ) { $ch = curl_init(); curl_setopt( $ch , curlopt_url, $url ); curl_setopt( $ch , curlopt_ssl_verifypeer, false); curl_setopt( $ch , curlopt_ssl_verifyhost, false); curl_setopt( $ch , curlopt_returntransfer, 1); $output = curl_exec( $ch ); curl_close( $ch ); $jsoninfo = json_decode( $output , true); return $jsoninfo ; } // +---------------------------------------------------------------------- // | post ssl请求 // +---------------------------------------------------------------------- public function curlpostssl( $url , $vars , $second =30, $aheader = array ()){ $ch = curl_init(); //超时时间 curl_setopt( $ch ,curlopt_timeout, $second ); curl_setopt( $ch ,curlopt_returntransfer, 1); //这里设置代理,如果有的话 curl_setopt( $ch ,curlopt_url, $url ); curl_setopt( $ch ,curlopt_ssl_verifypeer,false); curl_setopt( $ch ,curlopt_ssl_verifyhost,false); //curl_setopt($ch,curlopt_sslcerttype,'pem'); curl_setopt( $ch ,curlopt_sslcert, getcwd (). '/cert/apiclient_cert.pem' ); //curl_setopt($ch,curlopt_sslkeytype,'pem'); curl_setopt( $ch ,curlopt_sslkey, getcwd (). '/cert/apiclient_key.pem' ); if ( count ( $aheader ) >= 1 ){ curl_setopt( $ch , curlopt_httpheader, $aheader ); } curl_setopt( $ch ,curlopt_post, 1); curl_setopt( $ch ,curlopt_postfields, $vars ); $data = curl_exec( $ch ); if ( $data ){ curl_close( $ch ); return $data ; } else { $error = curl_errno( $ch ); echo "call faild, errorcode:$error\n" ; curl_close( $ch ); return false; } } // +---------------------------------------------------------------------- // | 发送退款 // 退款单号 out_trade_no // 交易金额 total_fee // 退款金额 refund_fee // +---------------------------------------------------------------------- public function refund( $out_trade_no , $total_fee , $refund_fee ){ $arr [ 'appid' ] = $this ->wechatappid; $arr [ 'mch_id' ] = $this ->wechatmchid; $arr [ 'nonce_str' ] = $this ->getnoncestr(); $arr [ 'out_trade_no' ] = $out_trade_no ; $arr [ 'out_refund_no' ] = $this ->getnoncestr(); $arr [ 'total_fee' ] = $total_fee ; $arr [ 'refund_fee' ] = $refund_fee ; $arr [ 'sign' ] = $this ->makesign( $arr ); //将统一下单数组 转换xml $xml = $this ->toxml( $arr ); //post xml 到微信退款接口 $url = "https://api.mch.weixin.qq.com/secapi/pay/refund" ;;//微信退款地址,post请求 $ch =curl_init(); //需要获取的url地址,也可以在 curl_init() 函数中设置。 curl_setopt( $ch ,curlopt_url, $url ); //启用时会将头文件的信息作为数据流输出。 //curl_setopt($ch,curlopt_header,1); //将 curl_exec() 获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt( $ch ,curlopt_returntransfer,1); //证书检查 curl_setopt( $ch ,curlopt_ssl_verifypeer,false); //证书的类型。支持的格式有"pem" (默认值), "der"和"eng"。 curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); //一个包含pem格式证书的文件名。 curl_setopt( $ch ,curlopt_sslcert,gen. '/cert/apiclient_cert.pem' ); curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); curl_setopt( $ch ,curlopt_timeout,30); //包含ssl私钥的文件名。 curl_setopt( $ch ,curlopt_sslkey,gen. '/cert/apiclient_key.pem' ); curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); //一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和 curlopt_ssl_verifypeer 一起使用时才有意义。 . // curl_setopt($ch,curlopt_cainfo,getcwd().'/cert/rootca.pem'); curl_setopt( $ch ,curlopt_post,1); curl_setopt( $ch ,curlopt_postfields, $xml ); $data =curl_exec( $ch ); if ( $data ){ curl_close( $ch ); $data_arr = json_decode(json_encode(simplexml_load_string( $data , 'simplexmlelement' , libxml_nocdata)), true); return $data_arr ; } else { $error = curl_errno( $ch ); return "curl 错误:" . $error ; } } // +---------------------------------------------------------------------- // | 企业付款 // 退款单号 out_trade_no // 交易金额 total_fee // 退款金额 refund_fee // +---------------------------------------------------------------------- public function payment( $partner_trade_no , $openid , $amount , $desc ){ // 获取 $arr [ 'mch_appid' ] = $this ->wechatappid; $arr [ 'mchid' ] = $this ->wechatmchid; $arr [ 'nonce_str' ] = $this ->getnoncestr(); $arr [ 'partner_trade_no' ] = $partner_trade_no ; $arr [ 'openid' ] = $openid ; $arr [ 'check_name' ] = "no_check" ; $arr [ 'amount' ] = $amount *100; $arr [ 'desc' ] = $desc ; $arr [ 'spbill_create_ip' ] = request()->ip(); $arr [ 'sign' ] = $this ->makesign( $arr ); //将统一下单数组 转换xml $xml = $this ->toxml( $arr ); //post xml 到微信退款接口 $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers" ;//微信退款地址,post请求 $ch =curl_init(); //需要获取的url地址,也可以在 curl_init() 函数中设置。 curl_setopt( $ch ,curlopt_url, $url ); //启用时会将头文件的信息作为数据流输出。 //curl_setopt($ch,curlopt_header,1); //将 curl_exec() 获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt( $ch ,curlopt_returntransfer,1); //证书检查 curl_setopt( $ch ,curlopt_ssl_verifypeer,false); //证书的类型。支持的格式有"pem" (默认值), "der"和"eng"。 curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); //一个包含pem格式证书的文件名。 curl_setopt( $ch ,curlopt_sslcert,gen. '/cert/apiclient_cert.pem' ); curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); curl_setopt( $ch ,curlopt_timeout,30); //包含ssl私钥的文件名。 curl_setopt( $ch ,curlopt_sslkey,gen. '/cert/apiclient_key.pem' ); curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); //一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和 curlopt_ssl_verifypeer 一起使用时才有意义。 . // curl_setopt($ch,curlopt_cainfo,getcwd().'/cert/rootca.pem'); curl_setopt( $ch ,curlopt_post,1); curl_setopt( $ch ,curlopt_postfields, $xml ); $data =curl_exec( $ch ); if ( $data ){ curl_close( $ch ); $data_arr = json_decode(json_encode(simplexml_load_string( $data , 'simplexmlelement' , libxml_nocdata)), true); return $data_arr ; } else { $error = curl_errno( $ch ); return "curl 错误:" . $error ; } } // +---------------------------------------------------------------------- // | post请求 // +---------------------------------------------------------------------- public function curlpost( $url , $post_data ) { $ch = curl_init(); curl_setopt( $ch , curlopt_url, $url ); curl_setopt( $ch , curlopt_ssl_verifypeer, false); curl_setopt( $ch , curlopt_ssl_verifyhost, false); if (! empty ( $post_data )){ curl_setopt( $ch , curlopt_post, 1); curl_setopt( $ch , curlopt_postfields, $post_data ); } curl_setopt( $ch , curlopt_returntransfer, 1); $output = curl_exec( $ch ); return $output ; } // +---------------------------------------------------------------------- // | 齐力短信 // +---------------------------------------------------------------------- public function message( $mobile ){ $info = m( 'web' ) -> find(); $post_data = array (); $post_data [ 'userid' ] = $info [ 'message_id' ]; $post_data [ 'account' ] = $info [ 'message_account' ]; $post_data [ 'password' ] = $info [ 'message_password' ]; $code = rand(1111,9999); session( 'code' , $code ); $post_data [ 'content' ] = $info [ 'message_autograph' ]. '您的验证码是:' . $code . ' 请务必保管好,以免泄露' ; $post_data [ 'mobile' ] = $mobile ; $post_data [ 'sendtime' ] = date ( 'y-m-d' ); $url = 'http://pt.sdqlweb.com/sms.aspx?action=send' ; $o = '' ; foreach ( $post_data as $k => $v ) { $o .= "$k=" .urlencode( $v ). '&' ; } $post_data = substr ( $o ,0,-1); $ch = curl_init(); curl_setopt( $ch , curlopt_ssl_verifypeer, false); curl_setopt( $ch , curlopt_ssl_verifyhost, false); curl_setopt( $ch , curlopt_post, 1); curl_setopt( $ch , curlopt_url, $url ); curl_setopt( $ch , curlopt_postfields, $post_data ); curl_setopt( $ch , curlopt_returntransfer, 1); $data = curl_exec( $ch ); $data = json_decode(json_encode(simplexml_load_string( $data , 'simplexmlelement' , libxml_nocdata)), true); curl_close( $ch ); return $data ; } // +---------------------------------------------------------------------- // | 以post方式提交xml到对应的接口url // +---------------------------------------------------------------------- public function postxmlcurl( $xml , $url , $usecert = false, $second = 30) { $ch = curl_init(); //设置超时 curl_setopt( $ch , curlopt_timeout, $second ); curl_setopt( $ch ,curlopt_url, $url ); curl_setopt( $ch ,curlopt_ssl_verifypeer,false); curl_setopt( $ch ,curlopt_ssl_verifyhost,2); //严格校验 //设置header curl_setopt( $ch , curlopt_header, false); //要求结果为字符串且输出到屏幕上 curl_setopt( $ch , curlopt_returntransfer, true); //post提交方式 curl_setopt( $ch , curlopt_post, true); curl_setopt( $ch , curlopt_postfields, $xml ); //运行curl $data = curl_exec( $ch ); //返回结果 if ( $data ){ curl_close( $ch ); return $data ; } else { $error = curl_errno( $ch ); curl_close( $ch ); } } // +---------------------------------------------------------------------- // | 输出xml字符 // +---------------------------------------------------------------------- public function toxml( $array ) { if (! is_array ( $array ) || count ( $array ) <= 0) { throw new wxpayexception( "数组数据异常!" ); } $xml = "<xml>" ; foreach ( $array as $key => $val ) { if ( is_numeric ( $val )){ $xml .= "<" . $key . ">" . $val . "</" . $key . ">" ; } else { $xml .= "<" . $key . "><![cdata[" . $val . "]]></" . $key . ">" ; } } $xml .= "</xml>" ; return $xml ; } // +---------------------------------------------------------------------- // | 获取微信ras公钥 // +---------------------------------------------------------------------- public function get_pub_key(){ $url = "https://fraud.mch.weixin.qq.com/risk/getpublickey" ; $arr [ 'mch_id' ] = $this ->wechatmchid; $arr [ 'nonce_str' ] = $this ->getnoncestr(); $arr [ 'sign_type' ] = 'md5' ; $arr [ 'sign' ] = $this ->makesign( $arr ); $xml = $this ->toxml( $arr ); $ch = curl_init(); curl_setopt( $ch ,curlopt_url, $url ); curl_setopt( $ch ,curlopt_returntransfer,1); curl_setopt( $ch ,curlopt_ssl_verifypeer,1); curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); curl_setopt( $ch ,curlopt_sslcert, getcwd (). '/cert/apiclient_cert.pem' ); curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); curl_setopt( $ch ,curlopt_sslkey, getcwd (). '/cert/apiclient_key.pem' ); curl_setopt( $ch ,curlopt_sslcerttype, 'pem' ); curl_setopt( $ch ,curlopt_cainfo, getcwd (). '/cert/rootca.pem' ); curl_setopt( $ch ,curlopt_post,1); curl_setopt( $ch ,curlopt_postfields, $xml ); $data = $this ->fromxml(curl_exec( $ch )); //要创建的两个文件 $txtfilename = "./cert/public.pem" ; //以读写方式打写指定文件,如果文件不存则创建 if ( ( $txtres = fopen ( $txtfilename , "w+" )) === false){ echo ( "创建可写文件:" . $txtfilename . "失败" ); exit (); } echo ( "创建可写文件" . $txtfilename . "成功!</br>" ); $strconents = $data [ 'pub_key' ]; //要 写进文件的内容 if (!fwrite ( $txtres , $strconents )){ //将信息写入文件 echo ( "尝试向文件" . $txtfilename . "写入" . $strconents . "失败!" ); fclose( $txtres ); exit (); } echo ( "尝试向文件" . $txtfilename . "写入" . $strconents . "成功!" ); fclose ( $txtres ); //关闭指针 } // +---------------------------------------------------------------------- // | 将xml转为array // +---------------------------------------------------------------------- public function fromxml( $xml ) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $this ->values = json_decode(json_encode(simplexml_load_string( $xml , 'simplexmlelement' , libxml_nocdata)), true); return $this ->values; } // +---------------------------------------------------------------------- // | 微信银行卡编码 // +---------------------------------------------------------------------- public function cardcode( $card_name ) { $arr = array ( '工商银行' =>1002, '农业银行' =>1005, '中国银行' =>1026, '建设银行' =>1003, '招商银行' =>1001, '邮储银行' =>1066, '交通银行' =>1020, '浦发银行' =>1004, '民生银行' =>1006, '兴业银行' =>1009, '平安银行' =>1010, '中信银行' =>1021, '华夏银行' =>1025, '广发银行' =>1027, '光大银行' =>1022, '北京银行' =>1032, '宁波银行' =>1056 ); foreach ( $arr as $k => $v ){ if ( $k == $card_name ){ return $v ; } } } // +---------------------------------------------------------------------- // | 格式化参数格式化成url参数 // +---------------------------------------------------------------------- public function tourlparams( $array ) { $buff = "" ; foreach ( $array as $k => $v ) { if ( $k != "sign" && $v != "" && ! is_array ( $v )){ $buff .= $k . "=" . $v . "&" ; } } $buff = trim( $buff , "&" ); return $buff ; } // +---------------------------------------------------------------------- // | 生成签名 本函数不覆盖sign成员变量,如要设置签名需要调用setsign方法赋值 // +---------------------------------------------------------------------- public function makesign( $array ) { //签名步骤一:按字典序排序参数 ksort( $array ); $string = $this ->tourlparams( $array ); //签名步骤二:在string后加入key $string = $string . "&key=" . $this ->wechatprivatekey; //签名步骤三:md5加密 $string = md5( $string ); //签名步骤四:所有字符转为大写 $string = strtoupper ( $string ); return $string ; } // +---------------------------------------------------------------------- // | 产生的随机字符串 // +---------------------------------------------------------------------- public function getnoncestr( $length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789" ; $str = "" ; for ( $i = 0; $i < $length ; $i ++ ) { $str .= substr ( $chars , mt_rand(0, strlen ( $chars )-1), 1); } return $str ; } // +---------------------------------------------------------------------- // | 打印log日志 // +---------------------------------------------------------------------- public function save_log( $msg ){ error_log ( date ( "y-m-d h:i:s" ). "\r\n" .print_r( $msg ,1). "\r\n \r\n \r\n " ,3, './error.log' ); } // +---------------------------------------------------------------------- // | 将图片上传至微信服务器 // +---------------------------------------------------------------------- public function curlimg( $images ){ $url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=" . $this ->getaccesstoken(). "&type=image" ; $ch1 = curl_init (); $timeout = 5; $real_path = "{$_server['document_root']}{$images}" ; $data = array ( "media" => "@{$real_path}" , 'form-data' => $file_info ); curl_setopt ( $ch1 , curlopt_url, $url ); curl_setopt ( $ch1 , curlopt_post, 1 ); curl_setopt ( $ch1 , curlopt_returntransfer, 1 ); curl_setopt ( $ch1 , curlopt_connecttimeout, $timeout ); curl_setopt ( $ch1 , curlopt_ssl_verifypeer, false ); curl_setopt ( $ch1 , curlopt_ssl_verifyhost, false ); curl_setopt ( $ch1 , curlopt_postfields, $data ); $result = curl_exec ( $ch1 ); curl_close ( $ch1 ); if (curl_errno()==0){ $result =json_decode( $result ,true); return $result ; } else { return false; } } // +---------------------------------------------------------------------- // | 将文章转换为微信文章 // +---------------------------------------------------------------------- public function wechattext( $content ){ $parrent = "/<[img|img].*?src='(.*?)'/" ; $str = html_entity_decode( $content ); preg_match_all( $parrent , $str , $match ); foreach ( $match [1] as $v ){ $imgurl = $this ->curlimg( $v ); $content = str_replace ( $v , $imgurl [ 'url' ], $content ); } return ( $content ); } // +---------------------------------------------------------------------- // | 验证银行卡号 // +---------------------------------------------------------------------- public function check_bank_card( $card ){ $url = "https://ccdcapi.alipay.com/validateandcachecardinfo.json?_input_charset=utf-8&cardno={$card}&cardbincheck=true" ; $data = $this ->curlget( $url ); $name = [ "srcb" => "深圳农村商业银行" , "bgb" => "广西北部湾银行" , "shrcb" => "上海农村商业银行" , "bjbank" => "北京银行" , "whccb" => "威海市商业银行" , "bozk" => "周口银行" , "korlabank" => "库尔勒市商业银行" , "spabank" => "平安银行" , "sdeb" => "顺德农商银行" , "hurcb" => "湖北省农村信用社" , "wrcb" => "无锡农村商业银行" , "bocy" => "朝阳银行" , "czbank" => "浙商银行" , "hdbank" => "邯郸银行" , "boc" => "中国银行" , "bod" => "东莞银行" , "ccb" => "中国建设银行" , "zycbank" => "遵义市商业银行" , "sxcb" => "绍兴银行" , "gzrcu" => "贵州省农村信用社" , "zjkccb" => "张家口市商业银行" , "bojz" => "锦州银行" , "bop" => "平顶山银行" , "hkb" => "汉口银行" , "spdb" => "上海浦东发展银行" , "nxrcu" => "宁夏黄河农村商业银行" , "nynb" => "广东南粤银行" , "grcb" => "广州农商银行" , "bosz" => "苏州银行" , "hzcb" => "杭州银行" , "hsbk" => "衡水银行" , "hbc" => "湖北银行" , "jxbank" => "嘉兴银行" , "hrxjb" => "华融湘江银行" , "bodd" => "丹东银行" , "aycb" => "安阳银行" , "egbank" => "恒丰银行" , "cdb" => "国家开发银行" , "tcrcb" => "江苏太仓农村商业银行" , "njcb" => "南京银行" , "zzbank" => "郑州银行" , "dycb" => "德阳商业银行" , "ybccb" => "宜宾市商业银行" , "scrcu" => "四川省农村信用" , "klb" => "昆仑银行" , "lsbank" => "莱商银行" , "ydrcb" => "尧都农商行" , "ccqtgb" => "重庆三峡银行" , "fdb" => "富滇银行" , "jsrcu" => "江苏省农村信用联合社" , "jnbank" => "济宁银行" , "cmb" => "招商银行" , "jinchb" => "晋城银行jcbank" , "fxcb" => "阜新银行" , "whrcb" => "武汉农村商业银行" , "hbycbank" => "湖北银行宜昌分行" , "tzcb" => "台州银行" , "taccb" => "泰安市商业银行" , "xcyh" => "许昌银行" , "ceb" => "中国光大银行" , "nxbank" => "宁夏银行" , "hsbank" => "徽商银行" , "jjbank" => "九江银行" , "nhqs" => "农信银清算中心" , "mtbank" => "浙江民泰商业银行" , "langfb" => "廊坊银行" , "ascb" => "鞍山银行" , "ksrb" => "昆山农村商业银行" , "yxccb" => "玉溪市商业银行" , "dlb" => "大连银行" , "drcbcl" => "东莞农村商业银行" , "gcb" => "广州银行" , "nbbank" => "宁波银行" , "boyk" => "营口银行" , "sxrccu" => "陕西信合" , "glbank" => "桂林银行" , "boqh" => "青海银行" , "cdrcb" => "成都农商银行" , "qdccb" => "青岛银行" , "hkbea" => "东亚银行" , "hbhsbank" => "湖北银行黄石分行" , "wzcb" => "温州银行" , "trcb" => "天津农商银行" , "qlbank" => "齐鲁银行" , "gdrcc" => "广东省农村信用社联合社" , "zjtlcb" => "浙江泰隆商业银行" , "gzb" => "赣州银行" , "gycb" => "贵阳市商业银行" , "cqbank" => "重庆银行" , "daqingb" => "龙江银行" , "cgnb" => "南充市商业银行" , "sccb" => "三门峡银行" , "csrcb" => "常熟农村商业银行" , "shbank" => "上海银行" , "jlbank" => "吉林银行" , "czrcb" => "常州农村信用联社" , "bankwf" => "潍坊银行" , "zrcbank" => "张家港农村商业银行" , "fjhxbc" => "福建海峡银行" , "zjnx" => "浙江省农村信用社联合社" , "lzyh" => "兰州银行" , "jsb" => "晋商银行" , "bohaib" => "渤海银行" , "czcb" => "浙江稠州商业银行" , "yqccb" => "阳泉银行" , "sjbank" => "盛京银行" , "xabank" => "西安银行" , "bsb" => "包商银行" , "jsbank" => "江苏银行" , "fscb" => "抚顺银行" , "hnrcu" => "河南省农村信用" , "comm" => "交通银行" , "xtb" => "邢台银行" , "citic" => "中信银行" , "hxbank" => "华夏银行" , "hnrcc" => "湖南省农村信用社" , "dyccb" => "东营市商业银行" , "orbank" => "鄂尔多斯银行" , "bjrcb" => "北京农村商业银行" , "xybank" => "信阳银行" , "zgccb" => "自贡市商业银行" , "cdcb" => "成都银行" , "hanabank" => "韩亚银行" , "cmbc" => "中国民生银行" , "lybank" => "洛阳银行" , "gdb" => "广东发展银行" , "zbcb" => "齐商银行" , "cbkf" => "开封市商业银行" , "h3cb" => "内蒙古银行" , "cib" => "兴业银行" , "crcbank" => "重庆农村商业银行" , "szsbk" => "石嘴山银行" , "dzbank" => "德州银行" , "srbank" => "上饶银行" , "lsccb" => "乐山市商业银行" , "jxrcu" => "江西省农村信用" , "icbc" => "中国工商银行" , "jzbank" => "晋中市商业银行" , "hzccb" => "湖州市商业银行" , "nhb" => "南海农村信用联社" , "xxbank" => "新乡银行" , "jrcb" => "江苏江阴农村商业银行" , "ynrcc" => "云南省农村信用社" , "abc" => "中国农业银行" , "gxrcu" => "广西省农村信用" , "psbc" => "中国邮政储蓄银行" , "bzmd" => "驻马店银行" , "arcu" => "安徽省农村信用社" , "gsrcu" => "甘肃省农村信用" , "lycb" => "辽阳市商业银行" , "jlrcu" => "吉林农信" , "urmqccb" => "乌鲁木齐市商业银行" , "xlbank" => "中山小榄村镇银行" , "cscb" => "长沙银行" , "jhbank" => "金华银行" , "bhb" => "河北银行" , "nbyz" => "鄞州银行" , "lsbc" => "临商银行" , "bocd" => "承德银行" , "sdrcu" => "山东农信" , "ncb" => "南昌银行" , "tccb" => "天津银行" , "wjrcb" => "吴江农商银行" , "cbbqs" => "城市商业银行资金清算中心" , "hbrcu" => "河北省农村信用社" ]; $bank = $data [ 'bank' ]; $name = $name [ $bank ]; if ( $name ){ if ( $bank ){ $url1 = "https://apimg.alipay.com/combo.png?d=cashier&t={$bank}" ; $msg [ 'pic' ] = $this ->curldownload( $url1 ,time(). '.png' ); $msg [ 'logo' ] = $this ->imagecropper( '.' . $msg [ 'pic' ],30,35); $msg [ 'status' ] = 200; $msg [ 'name' ] = $name ; return $msg ; } } else { $msg [ 'status' ] = 500; $msg [ 'data' ] = '系统检测到该银行卡无效,请输入有效银行卡卡号' ; return $msg ; } } /** * 图像裁剪 * @param $title string 原图路径 * @param $content string 需要裁剪的宽 * @param $encode string 需要裁剪的高 */ public function imagecropper( $source_path , $target_width , $target_height ){ $source_info = getimagesize ( $source_path ); $source_width = $source_info [0]; $source_height = $source_info [1]; $source_mime = $source_info [ 'mime' ]; $source_x = 0; $source_y = 0; switch ( $source_mime ) { case 'image/gif' : $source_image = imagecreatefromgif( $source_path ); break ; case 'image/jpeg' : $source_image = imagecreatefromjpeg( $source_path ); break ; case 'image/png' : $source_image = imagecreatefrompng( $source_path ); break ; default : return false; break ; } $target_image = imagecreatetruecolor( $target_width , $target_height ); $cropped_image = imagecreatetruecolor( $target_width , $target_height ); // 裁剪 imagecopy( $cropped_image , $source_image ,0,0, $source_x , $source_y , $target_width , $target_height ); // 缩放 imagecopyresampled( $target_image , $cropped_image , 0, 0, 0, 0, $target_width , $target_height , $target_width , $target_height ); imagecolortransparent( $target_image ,imagecolorallocate( $target_image ,255,255,255)); $filename = time(). "1.png" ; $path = './uploads/card/' . $filename ; imagepng( $target_image , $path ); return '/uploads/card/' . $filename ; } // 随机字符 public function noncestr( $length = 12){ $chars = "0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" ; $str = "" ; for ( $i = 0; $i < $length ; $i ++ ) { $str .= substr ( $chars , mt_rand(0, strlen ( $chars )-1), 1); } return $str ; } } ?> |
下面是其他网友的补充
php获取小程序码并返回前端显示图片
小程序的二维码分为小程序码和二维码;
生成小程序二维码文档中说后端来生成。
参考 小程序开发文档资料:https://developers.weixin.qq.com/miniprogram/dev/api/getwxacodeunlimit.html
文档的参数介绍还是蛮详细的,但是没有具体的demo,对于请求的接口的返回值是进制流(也就是在浏览器显示一堆乱码)也是很令人懊恼,这里贴一下我的代码:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | //获取小程序码,这里调用的是小程序码的a接口类型 public function getqrcodeaction() { $data [ 'scene' ] = $this ->_req->getquery( 'shareid' ,11); //scence、page的使用要参考文档(比如:scene的值不能超过32个字符等) $data [ 'width' ] = $this ->_req->getquery( 'width' ,220); $data [ 'auto_color' ] = $this ->_req->getquery( 'auto_color' ); $data [ 'line_color' ] = $this ->_req->getquery( 'line_color' ); $data [ 'is_hyaline' ] = $this ->_req->getquery( 'is_hyaline' ,true); $data [ 'page' ] = $this ->_req->getquery( 'page' , "" ); //由这行以上代码是二维码的样式等由前端传值的形式,也可以直接在后端设置 $wxmodel = new wxauthmodel(); $token = $wxmodel ->getaccesstoken(); $res_url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=$token" ; //请求微信提供的接口 header( 'content-type:image/png' ); $data = json_encode( $data ); $qr_code = $wxmodel ->http_request( $res_url , $data ); //到这里就已经返回微信提供的返回数据了,这个时候的数据是二进制流,要处理下再返回给前端 file_put_contents ( '/tmp/qr_code.png' , $qr_code ); //将获得的数据读到一个临时图片里 $img_string = $this ->filetobase64( '/tmp/qr_code.png' ); //将图片文件转化为base64 response::result( $img_string ); } //本地文件转base64 private function filetobase64( $file ){ $base64_file = '' ; if ( file_exists ( $file )){ $mime_type = mime_content_type( $file ); //如果这里明确是图片的话我建议获取图片类型这句可以省略,直接知道了mine_type='image/png',因为我这里我虽然存的图片,但是读到的mine_type值为text/plain $base64_data = base64_encode ( file_get_contents ( $file )); $base64_file = 'data:' . $mime_type . ';base64,' . $base64_data ; //$base64_file = 'data:image/png;base64,'.$base64_data; } return $base64_file ; } /*获取access_token,不需要code参数,不能用于获取用户信息的token*/ public function getaccesstoken() { $token_file = '/dev/shm/heka2_token.json' ; //由于获取token的次数存在限制,所以将一段时间内的token缓存到一个文件(注意缓存路径服务器支持可写可读),过期后再重新获取 $data = json_decode( file_get_contents ( $token_file )); if ( $data ->expire_time < time()) { $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appid&secret=$this->appsecret" ; $res = json_decode( $this ->http_request( $url )); $access_token = $res ->access_token; if ( $access_token ) { $data ->expire_time = time() + 7000; $data ->access_token = $access_token ; file_put_contents ( $token_file , json_encode( $data )); } } else { $access_token = $data ->access_token; } return $access_token ; } |
感觉一个完整的php实现的代码目前我还没找到,这个自己用的还行。如有不恰当的地方,欢迎指出~ _
原文链接:https://www.cnblogs.com/zmdComeOn/p/13085394.html
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。