찾다
위챗 애플릿위챗 개발Yii2 WeChat 백엔드 개발 사용에 대한 자세한 소개

Yii2는 고성능 컴포넌트 기반 PHP 프레임워크입니다. 이 글에서는 Yii2를 사용한 WeChat 백엔드 개발을 자세히 소개합니다. 살펴 보겠습니다.

인터넷에 YII2.0 WeChat 개발에 대한 많은 튜토리얼이 있지만 너무 복잡하고 지저분하므로 오늘은 참고용으로 Yii2 WeChat 백엔드를 사용한 일련의 개발을 요약하겠습니다.

1: WeChat 접속

Yii2 배경 구성

1. app/config/params.php의 토큰 매개변수

return [
 //微信接入
 'wechat' =>[
 'token' => 'your token',
 ],
];

2. app/config/main.php에서 라우팅 구성

인터페이스 모듈은 RESTful API를 사용하므로 라우팅 규칙을 정의해야 합니다.

'urlManager' => [
 'enablePrettyUrl' => true,
 'enableStrictParsing' => true,
 'showScriptName' => false,
 'rules' => [
 [
  'class' => 'yii\rest\UrlRule',
  'controller' => 'wechat',
  'extraPatterns' => [
  'GET valid' => 'valid',
  ],
 ],
 ],
],

3. 앱/컨트롤러에서 새 WechatController를 생성합니다

<?php

namespace api\controllers;

use Yii;
use yii\rest\ActiveController;

class WechatController extends ActiveController
{

 public $modelClass = &#39;&#39;;

 public function actionValid()
 {
 $echoStr = $_GET["echostr"];
 $signature = $_GET["signature"];
 $timestamp = $_GET["timestamp"];
 $nonce = $_GET["nonce"];
 //valid signature , option
 if($this->checkSignature($signature,$timestamp,$nonce)){
  echo $echoStr;
 }
 }

 private function checkSignature($signature,$timestamp,$nonce)
 {
 // you must define TOKEN by yourself
 $token = Yii::$app->params[&#39;wechat&#39;][&#39;token&#39;];
 if (!$token) {
  echo &#39;TOKEN is not defined!&#39;;
 } else {
  $tmpArr = array($token, $timestamp, $nonce);
  // use SORT_STRING rule
  sort($tmpArr, SORT_STRING);
  $tmpStr = implode( $tmpArr );
  $tmpStr = sha1( $tmpStr );

  if( $tmpStr == $signature ){
  return true;
  }else{
  return false;
  }
 }
 }

}

WeChat 공식 계정 백그라운드 구성

WeChat 공식 계정 백그라운드에서 URL 및 Token을 구성한 후 제출하여 인증을 받으세요.

URL:http://app.demo.com/wechats/valid
Token:your token

2: 사용자 정보 얻기

사용자 테이블 디자인

코드

CREATE TABLE `wechat_user` (
  `id` int(11) NOT NULL,
  `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `nickname` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT &#39;微信昵称&#39;,
  `sex` tinyint(4) NOT NULL COMMENT &#39;性别&#39;,
  `headimgurl` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT &#39;头像&#39;,
  `country` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT &#39;国家&#39;,
  `province` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT &#39;省份&#39;,
  `city` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT &#39;城市&#39;,
  `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `refresh_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE `wechat_user`
  ADD PRIMARY KEY (`id`);

사용자 정보 획득 관련 인터페이스

1. 사용자 인증 인터페이스: access_token, openId 등을 획득하고 사용자를 저장합니다. 데이터베이스 정보

코드는 다음과 같습니다.

public function actionAccesstoken()
{
    $code = $_GET["code"];
    $state = $_GET["state"];
    $appid = Yii::$app->params[&#39;wechat&#39;][&#39;appid&#39;];
    $appsecret = Yii::$app->params[&#39;wechat&#39;][&#39;appsecret&#39;];
    $request_url = &#39;https://api.weixin.qq.com/sns/oauth2/access_token?appid=&#39;.$appid.&#39;&secret=&#39;.$appsecret.&#39;&code=&#39;.$code.&#39;&grant_type=authorization_code&#39;;
    //初始化一个curl会话
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $request_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    $result = $this->response($result);
    //获取token和openid成功,数据解析
    $access_token = $result[&#39;access_token&#39;];
    $refresh_token = $result[&#39;refresh_token&#39;];
    $openid = $result[&#39;openid&#39;];
    //请求微信接口,获取用户信息
    $userInfo = $this->getUserInfo($access_token,$openid);
    $user_check = WechatUser::find()->where([&#39;openid&#39;=>$openid])->one();
    if ($user_check) {
        //更新用户资料
    } else {
        //保存用户资料
    }
    //前端网页的重定向
    if ($openid) {
        return $this->redirect($state.$openid);
    } else {
        return $this->redirect($state);
    }
}

2. WeChat에서 사용자 정보 가져오기

코드는 다음과 같습니다. :

public function getUserInfo($access_token,$openid)
{
    $request_url = &#39;https://api.weixin.qq.com/sns/userinfo?access_token=&#39;.$access_token.&#39;&openid=&#39;.$openid.&#39;&lang=zh_CN&#39;;
    //初始化一个curl会话
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $request_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    $result = $this->response($result);
    return $result;
}

3 .사용자 정보 인터페이스 가져오기

public function actionUserinfo()
{
 if(isset($_REQUEST["openid"])){
  $openid = $_REQUEST["openid"];
  $user = WechatUser::find()->where([&#39;openid&#39;=>$openid])->one();
  if ($user) {
   $result[&#39;error&#39;] = 0;
   $result[&#39;msg&#39;] = &#39;获取成功&#39;;
   $result[&#39;user&#39;] = $user;
  } else {
   $result[&#39;error&#39;] = 1;
   $result[&#39;msg&#39;] = &#39;没有该用户&#39;;
  }
 } else {
  $result[&#39;error&#39;] = 1;
  $result[&#39;msg&#39;] = &#39;openid为空&#39;;
 }
 return $result;
}

3: WeChat 결제

1 .WeChat 결제 인터페이스: 패키지 결제 데이터

코드는 다음과 같습니다.

public function actionPay(){
    if(isset($_REQUEST["uid"])&&isset($_REQUEST["oid"])&&isset($_REQUEST["totalFee"])){
        //uid、oid、totalFee
        $uid = $_REQUEST["uid"];
        $oid = $_REQUEST["oid"];
        $totalFee = $_REQUEST["totalFee"];
        $timestamp = time();
        //微信支付参数
        $appid = Yii::$app->params[&#39;wechat&#39;][&#39;appid&#39;];
        $mchid = Yii::$app->params[&#39;wechat&#39;][&#39;mchid&#39;];
        $key = Yii::$app->params[&#39;wechat&#39;][&#39;key&#39;];
        $notifyUrl = Yii::$app->params[&#39;wechat&#39;][&#39;notifyUrl&#39;];
        //支付打包
        $wx_pay = new WechatPay($mchid, $appid, $key);
        $package = $wx_pay->createJsBizPackage($uid, $totalFee, $oid, $notifyUrl, $timestamp);
        $result[&#39;error&#39;] = 0;
        $result[&#39;msg&#39;] = &#39;支付打包成功&#39;;
        $result[&#39;package&#39;] = $package;
        return $result;
    }else{
        $result[&#39;error&#39;] = 1;
        $result[&#39;msg&#39;] = &#39;请求参数错误&#39;;
    }
    return $result;
}

2. 비동기 결제 결과 받기 WeChat에서 보낸 알림

코드는 다음과 같습니다.

public function actionNotify(){
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    $postObj = simplexml_load_string($postStr, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
    //
    if ($postObj === false) {
        die(&#39;parse xml error&#39;);
    }
    if ($postObj->return_code != &#39;SUCCESS&#39;) {
        die($postObj->return_msg);
    }
    if ($postObj->result_code != &#39;SUCCESS&#39;) {
        die($postObj->err_code);
    }
    //微信支付参数
    $appid = Yii::$app->params[&#39;wechat&#39;][&#39;appid&#39;];
    $mchid = Yii::$app->params[&#39;wechat&#39;][&#39;mchid&#39;];
    $key = Yii::$app->params[&#39;wechat&#39;][&#39;key&#39;];
    $wx_pay = new WechatPay($mchid, $appid, $key);
    //验证签名
    $arr = (array)$postObj;
    unset($arr[&#39;sign&#39;]);
    if ($wx_pay->getSign($arr, $key) != $postObj->sign) {
        die("签名错误");
    }
    //支付处理正确-判断是否已处理过支付状态
    $orders = Order::find()->where([&#39;uid&#39;=>$postObj->openid, &#39;oid&#39;=>$postObj->out_trade_no, &#39;status&#39; => 0])->all();
    if(count($orders) > 0){
        //更新订单状态
        foreach ($orders as $order) {
            //更新订单
            $order[&#39;status&#39;] = 1;
            $order->update();
        }
        return &#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;;
    } else {
        //订单状态已更新,直接返回
        return &#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;;
    }
}

3. Wechat 결제 클래스 WechatPay.php

코드는 다음과 같습니다.

<?php
namespace api\sdk;
use Yii;
class WechatPay
{
    protected $mchid;
    protected $appid;
    protected $key;
    public function __construct($mchid, $appid, $key){
        $this->mchid = $mchid;
        $this->appid = $appid;
        $this->key = $key;
    }
    public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp){
        $config = array(
            &#39;mch_id&#39; => $this->mchid,
            &#39;appid&#39; => $this->appid,
            &#39;key&#39; => $this->key,
        );
        $unified = array(
            &#39;appid&#39; => $config[&#39;appid&#39;],
            &#39;attach&#39; => &#39;支付&#39;,
            &#39;body&#39; => $orderName,
            &#39;mch_id&#39; => $config[&#39;mch_id&#39;],
            &#39;nonce_str&#39; => self::createNonceStr(),
            &#39;notify_url&#39; => $notifyUrl,
            &#39;openid&#39; => $openid,
            &#39;out_trade_no&#39; => $outTradeNo,
            &#39;spbill_create_ip&#39; => &#39;127.0.0.1&#39;,
            &#39;total_fee&#39; => intval($totalFee * 100),
            &#39;trade_type&#39; => &#39;JSAPI&#39;,
        );
        $unified[&#39;sign&#39;] = self::getSign($unified, $config[&#39;key&#39;]);
        $responseXml = self::curlPost(&#39;https://api.mch.weixin.qq.com/pay/unifiedorder&#39;, self::arrayToXml($unified));
        $unifiedOrder = simplexml_load_string($responseXml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
        if ($unifiedOrder === false) {
            die(&#39;parse xml error&#39;);
        }
        if ($unifiedOrder->return_code != &#39;SUCCESS&#39;) {
            die($unifiedOrder->return_msg);
        }
        if ($unifiedOrder->result_code != &#39;SUCCESS&#39;) {
            die($unifiedOrder->err_code);
        }
        $arr = array(
            "appId" => $config[&#39;appid&#39;],
            "timeStamp" => $timestamp,
            "nonceStr" => self::createNonceStr(),
            "package" => "prepay_id=" . $unifiedOrder->prepay_id,
            "signType" => &#39;MD5&#39;,
        );
        $arr[&#39;paySign&#39;] = self::getSign($arr, $config[&#39;key&#39;]);
        return $arr;
    }
    public static function curlGet($url = &#39;&#39;, $options = array()){
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    public static function curlPost($url = &#39;&#39;, $postData = &#39;&#39;, $options = array()){
        if (is_array($postData)) {
            $postData = http_build_query($postData);
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    public static function createNonceStr($length = 16){
        $chars = &#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&#39;;
        $str = &#39;&#39;;
        for ($i = 0; $i<$length; $i++){
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
    public static function arrayToXml($arr){
        $xml = "<xml>";
        foreach ($arr as $key => $val){
            if (is_numeric($val)) {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
            }
        }
        $xml .= "</xml>";
        return $xml;
    }
    public static function getSign($params, $key){
        ksort($params, SORT_STRING);
        $unSignParaString = self::formatQueryParaMap($params, false);
        $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
        return $signStr;
    }
    protected static function formatQueryParaMap($paraMap, $urlEncode = false){
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v){
            if (null != $v && "null" != $v) {
                if ($urlEncode) {
                    $v = urlencode($v);
                }
                $buff .= $k . "=" . $v . "&";
            }
        }
        $reqPar = &#39;&#39;;
        if (strlen($buff)>0) {
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }
        return $reqPar;
    }
}

4: JS 가져오기 - SDK의 구성 매개변수

WeChat 공개 플랫폼 개발자 문서에 따르면:

JS-SDK를 사용해야 하는 모든 페이지는 먼저 구성 정보를 삽입해야 합니다. 그렇지 않으면 호출되지 않습니다. (URL과 마찬가지로 한 번만 호출하면 됩니다. URL을 변경하는 SPA 웹 앱은 URL이 호출될 때마다 호출할 수 있습니다. 현재 Android WeChat 클라이언트는 pushState의 새로운 H5 기능을 지원하지 않으므로 pushState를 사용하여 웹 앱 페이지를 구현하면 서명이 실패하게 됩니다. 이 문제는 Android 6.2에서 해결됩니다.

즉,

코드는 다음과 같습니다.

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: &#39;&#39;, // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: &#39;&#39;, // 必填,生成签名的随机串
    signature: &#39;&#39;,// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

1. Wechat 결제 클래스 WechatPay.php

코드입니다.

<?php
namespace api\sdk;
use Yii;
class WechatPay
{
    public function getSignPackage($url) {
        $jsapiTicket = self::getJsApiTicket();
        $timestamp = time();
        $nonceStr = self::createNonceStr();
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=".$jsapiTicket."&noncestr=".$nonceStr."&timestamp=".$timestamp."&url=".$url;
        $signature = sha1($string);
        $signPackage = array(
            "appId"     => $this->appid,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }
    public static function getJsApiTicket() {
        //使用Redis缓存 jsapi_ticket
        $redis = Yii::$app->redis;
        $redis_ticket = $redis->get(&#39;wechat:jsapi_ticket&#39;);
        if ($redis_ticket) {
            $ticket = $redis_ticket;
        } else {
            $accessToken = self::getAccessToken();
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=".$accessToken;
            $res = json_decode(self::curlGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $redis->set(&#39;wechat:jsapi_ticket&#39;, $ticket);
                $redis->expire(&#39;wechat:jsapi_ticket&#39;, 7000);
            }
        }
        return $ticket;
    }
    public static function getAccessToken() {
        //使用Redis缓存 access_token
        $redis = Yii::$app->redis;
        $redis_token = $redis->get(&#39;wechat:access_token&#39;);
        if ($redis_token) {
            $access_token = $redis_token;
        } else {
            $appid = Yii::$app->params[&#39;wechat&#39;][&#39;appid&#39;];
            $appsecret = Yii::$app->params[&#39;wechat&#39;][&#39;appsecret&#39;];
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
            $res = json_decode(self::curlGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $redis->set(&#39;wechat:access_token&#39;, $access_token);
                $redis->expire(&#39;wechat:access_token&#39;, 7000);
            }
        }
        return $access_token;
    }
    public static function curlGet($url = &#39;&#39;, $options = array()){
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    public static function curlPost($url = &#39;&#39;, $postData = &#39;&#39;, $options = array()){
        if (is_array($postData)) {
            $postData = http_build_query($postData);
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https请求 不验证证书和host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    public static function createNonceStr($length = 16){
        $chars = &#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&#39;;
        $str = &#39;&#39;;
        for ($i = 0; $i<$length; $i++){
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
}

2. 구성 매개변수 인터페이스 가져오기

public function actionConfig(){
 if (isset($_REQUEST[&#39;url&#39;])) {
 $url = $_REQUEST[&#39;url&#39;];
 //微信支付参数
 $appid = Yii::$app->params[&#39;wechat&#39;][&#39;appid&#39;];
 $mchid = Yii::$app->params[&#39;wechat&#39;][&#39;mchid&#39;];
 $key = Yii::$app->params[&#39;wechat&#39;][&#39;key&#39;];
 $wx_pay = new WechatPay($mchid, $appid, $key);
 $package = $wx_pay->getSignPackage($url);
 $result[&#39;error&#39;] = 0;
 $result[&#39;msg&#39;] = &#39;获取成功&#39;;
 $result[&#39;config&#39;] = $package;
 } else {
 $result[&#39;error&#39;] = 1;
 $result[&#39;msg&#39;] = &#39;参数错误&#39;;
 }
 return $result;
}

위 내용은 Yii2 WeChat 백엔드 개발 사용에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.