paypal IPN and PDT 相关文档说明:

https://developer.paypal.com/docs/classic/ipn/gs_IPN/

https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNTesting/

https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNPDTAnAlternativetoIPN/

https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/

中文介绍:

http://ppdev.ebay.cn/files/developer/PayPal_PDT_Token_CHN.pdf

http://wenku.baidu.com/link?url=Fgv-l09iCnGQGDuMgdTT94c8YiwuqLEB5qT8tfzBseRdlGICHXsD00N_Zx9q5vbFdydQPXlQFRssgI65ac_4g0RzBHygsWU8V7f5cKjo8AW

PDT:Auto Return for Website Payments brings your buyers back to your website immediately after payment completion. Auto Return applies to PayPal Website Payments, including Buy Now, Subscriptions, and Shopping Cart. Learn More。

如果是网站按钮方式付款,PDT通知的url也可以用表单的return值设置,会被按钮设置中第三部设置的成功返回的url覆盖。

IPN:Instant Payment Notification (IPN)

You have turned on the IPN feature. You can view your IPNs on the IPN History page. If necessary, you can resend IPN messages from that page. For more information on using and troubleshooting this feature, read more about Instant Payment Notification (IPN).

Your listener must respond to every IPN message it gets, whether you take action on it or not. If you do not respond, PayPal assumes the IPN was not received and re-sends it. Further, PayPal continues to re-send the message periodically until your listener responds, although the interval between retries increases with each attempt. An IPN will be resent for up to four days, with a maximum of 15 retries.

IPN可以通过模拟器触发,针对网站按钮方式付款,可以被表单的notify_url覆盖。

处理PDT关键是获取 PayPal 交易流水号 tx , 另外需要token。如果是IPN 和 PDT 是互补的关系,IPN优点:可以获取各种通知,会重发,The maximum number of retries is 15。缺点:异步,延迟。PDT实时,但是只能获取付款完成的通知。

测试方法:

用php程序测试,使用paypal的sanbox环境测试。

安装php

安装curl

wget http://curl.haxx.se/download/curl-7.39.0.zip
unzip curl-7.39.0.zip
cd curl-7.39.0
configure
make
make install

安装curl扩展

../../../php/bin/phpize

./configure  --with-php-config=../../../php/bin/php-config
make
make install

生成 /home/pig/php/lib/php/extensions/no-debug-non-zts-20131226/curl.so

复制,修改php.ini

cp /home/pig/php-5.6.3/php.ini-development /home/pig/php/lib/php.ini

extension=curl.so

测试curl扩展安装是否成功
/home/pig/php/bin/php -r "var_dump(curl_init());"
resource(4) of type (curl)

安装openssl扩展,否则fopensocket不支持ssl

cd php-5.6.3/ext/openssl/
mv config0.m4 config.m4
/home/pig/php/bin/phpize
./configure --with-php-config=/home/pig/php/bin/php-config
make
make install

修改php.ini, 加上extension=openssl.so

检查openssl扩展是否装好:

/home/dog/php/bin/php -r 'var_dump(fsockopen("tls://www.sandbox.paypal.com", 443, $errno, $errstr, 30));'
resource(4) of type (stream)

启动server:

/home/pig/php/bin/php -S 0.0.0.0:5000 -t ./

配置nginx:

location ^~ /paytest/ {
             proxy_pass_header Server;
             proxy_set_header Host $http_host;
             proxy_redirect off;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Scheme $scheme;
             proxy_pass http://localhost:5000;
         }

-----------------------------------------------------------------------------------------------------------------------------------------------------------

运用paypal的sandbox环境测试paypent,测试IPN和PDT,思路是写一个程序部署到外网环境,把请求的参数全部记录到日志里面,然后过程一目了然。

<?php
error_reporting(7);
ini_set("display_errors", 1);
date_default_timezone_set('PRC');define("DEBUG", 1);
define("USE_SANDBOX", 1);
define("LOG_FILE", "./ipn.log");$act= $_REQUEST['act'];if($act== 'ok'){p('ok');if(isset($_GET['tx'])){$tx = $_GET['tx'];$data= get_payment_data($tx);p('pdt', $data);}
}elseif($act== 'err'){p('err');
}elseif($act== 'ipn'){p('ipn');header('HTTP/1.1 200 OK'); // Read POST data// reading posted data directly from $_POST causes serialization// issues with array data in POST. Reading raw POST data from input stream instead.$raw_post_data = file_get_contents('php://input');$raw_post_array = explode('&', $raw_post_data);$myPost = array();foreach ($raw_post_array as $keyval) {$keyval = explode ('=', $keyval);if (count($keyval) == 2)$myPost[$keyval[0]] = urldecode($keyval[1]);}// read the post from PayPal system and add 'cmd'$req = 'cmd=_notify-validate';if(function_exists('get_magic_quotes_gpc')) {$get_magic_quotes_exists = true;}foreach ($myPost as $key => $value) {if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {$value = urlencode(stripslashes($value));} else {$value = urlencode($value);}$req .= "&$key=$value";}// Post IPN data back to PayPal to validate the IPN data is genuine// Without this step anyone can fake IPN dataif(USE_SANDBOX == true) {$paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr";} else {$paypal_url = "https://www.paypal.com/cgi-bin/webscr";}$ch = curl_init($paypal_url);if ($ch == FALSE) {return FALSE;}curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);curl_setopt($ch, CURLOPT_POSTFIELDS, $req);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);if(DEBUG == true) {curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLINFO_HEADER_OUT, 1);}// CONFIG: Optional proxy configuration//curl_setopt($ch, CURLOPT_PROXY, $proxy);//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);// Set TCP timeout to 30 secondscurl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));// CONFIG: Please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path// of the certificate as shown below. Ensure the file is readable by the webserver.// This is mandatory for some environments.//$cert = __DIR__ . "./cacert.pem";//curl_setopt($ch, CURLOPT_CAINFO, $cert);$res = curl_exec($ch);if (curl_errno($ch) != 0) // cURL error{if(DEBUG == true) {    error_log(date('[Y-m-d H:i e] '). "Can't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE);}curl_close($ch);exit;} else {// Log the entire HTTP response if debug is switched on.if(DEBUG == true) {error_log(date('[Y-m-d H:i e] '). "HTTP request of validation request:". curl_getinfo($ch, CURLINFO_HEADER_OUT) ." for IPN payload: $req" . PHP_EOL, 3, LOG_FILE);error_log(date('[Y-m-d H:i e] '). "HTTP response of validation request: $res" . PHP_EOL, 3, LOG_FILE);}curl_close($ch);}// Inspect IPN validation result and act accordingly// Split response headers and payload, a better way for strcmp$tokens = explode("\r\n\r\n", trim($res));$res = trim(end($tokens));if (strcmp ($res, "VERIFIED") == 0) {// check whether the payment_status is Completed// check that txn_id has not been previously processed// check that receiver_email is your PayPal email// check that payment_amount/payment_currency are correct// process payment and mark item as paid.// assign posted variables to local variables//$item_name = $_POST['item_name'];//$item_number = $_POST['item_number'];//$payment_status = $_POST['payment_status'];//$payment_amount = $_POST['mc_gross'];//$payment_currency = $_POST['mc_currency'];//$txn_id = $_POST['txn_id'];//$receiver_email = $_POST['receiver_email'];//$payer_email = $_POST['payer_email'];if(DEBUG == true) {error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);}} else if (strcmp ($res, "INVALID") == 0) {// log for manual investigation// Add business logic here which deals with invalid IPN messagesif(DEBUG == true) {error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);}}
}elseif($act== 'return'){p('return');
}else{print <<<EOT
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="PVL538Z86ED9N">
<input type="hidden" name="uid" value="678">
<input type="image" src="https://www.sandbox.paypal.com/en_US/C2/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>EOT;
}function p($name, $var= null){$t= date('Y-m-d H:i:s');$name= $name.".txt";if($var== null){file_put_contents($name, var_export($_REQUEST, true)."\n".$t."\n\n\n", FILE_APPEND);}else{file_put_contents($name, var_export($var, true)."\n".$t."\n\n\n", FILE_APPEND);}
}/*** Get PayPal Payment Data* Read more at http://ethanblog.com/tech/webdev/php-for-paypal-payment-data-transfer.html* @param   $tx Transaction ID* @return      PayPal Payment Data or FALSE*/
function get_payment_data($tx)
{// PDT Identity Token$at_token = 'cwO4mbBZybR0-fbijkszjeoeTxe9XB16HjuvvdbmDIBOTTxuNxDBzKwBpp8';// Init cURL$request = curl_init();// Set request optionscurl_setopt_array($request, array(CURLOPT_URL => 'https://www.sandbox.paypal.com/cgi-bin/webscr',CURLOPT_POST => TRUE,CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-synch','tx' => $tx,'at' => $at_token,)),CURLOPT_RETURNTRANSFER => TRUE,CURLOPT_HEADER => FALSE//,// CURLOPT_SSL_VERIFYPEER => TRUE,// CURLOPT_CAINFO => 'cacert.pem',));// Execute request and get response and status code$response = curl_exec($request);$status   = curl_getinfo($request, CURLINFO_HTTP_CODE);// Close connectioncurl_close($request);// Validate responseif($status == 200 AND strpos($response, 'SUCCESS') === 0){// Remove SUCCESS part (7 characters long)$response = substr($response, 7);// Urldecode it$response = urldecode($response);// Turn it into associative arraypreg_match_all('/^([^=\r\n]++)=(.*+)/m', $response, $m, PREG_PATTERN_ORDER);$response = array_combine($m[1], $m[2]);// Fix character encoding if neededif(isset($response['charset']) AND strtoupper($response['charset']) !== 'UTF-8'){foreach($response as $key => &$value){$value = iconv($response['charset'], 'UTF-8', $value);}$response['charset_original'] = $response['charset'];$response['charset'] = 'UTF-8';}// Sort on keysksort($response);// Done!return $response;}return FALSE;
}

输出如下:

[pig@ip-10-236-139-149 paytest]$ cat ok.txt
array (
  'act' => 'ok',
  'tx' => '8NG39315CL727724E',
  'st' => 'Completed',
  'amt' => '55.90',
  'cc' => 'USD',
  'cm' => '',
  'item_number' => '',
)
2014-12-06 20:41:43

[pig@ip-10-236-139-149 paytest]$ cat pdt.txt
array (
  'address_city' => 'Shanghai',
  'address_country' => 'China',
  'address_country_code' => 'CN',
  'address_name' => 'Buyer Test',
  'address_state' => 'Shanghai',
  'address_status' => 'unconfirmed',
  'address_street' => 'NO 1 Nan Jin Road',
  'address_zip' => '200000',
  'btn_id' => '3042078',
  'business' => 'xxx.2013.03-facilitator@gmail.com',
  'charset' => 'UTF-8',
  'charset_original' => 'gb2312',
  'custom' => '',
  'discount' => '0.00',
  'first_name' => 'Test',
  'handling_amount' => '0.00',
  'insurance_amount' => '0.00',
  'item_name' => 'sandbox_item111',
  'item_number' => '',
  'last_name' => 'Buyer',
  'mc_currency' => 'USD',
  'mc_fee' => '2.20',
  'mc_gross' => '55.90',
  'payer_email' => 'xxx2013.03-buyer@gmail.com',
  'payer_id' => 'JARYJK2TES6C6',
  'payer_status' => 'unverified',
  'payment_date' => '04:26:00 Dec 06, 2014 PST',
  'payment_fee' => '2.20',
  'payment_gross' => '55.90',
  'payment_status' => 'Completed',
  'payment_type' => 'instant',
  'protection_eligibility' => 'Eligible',
  'quantity' => '1',
  'receiver_email' => 'yxw.2013.03-facilitator@gmail.com',
  'receiver_id' => '2XP27KEMUVN8A',
  'residence_country' => 'CN',
  'shipping' => '10.00',
  'shipping_discount' => '0.00',
  'shipping_method' => 'Default',
  'tax' => '0.90',
  'transaction_subject' => '',
  'txn_id' => '8NG39315CL727724E',
  'txn_type' => 'web_accept',
)
2014-12-06 20:41:44

[pig@ip-10-236-139-149 paytest]$ cat ipn.txt
array (
  'act' => 'ipn',
  'mc_gross' => '55.90',
  'protection_eligibility' => 'Eligible',
  'address_status' => 'unconfirmed',
  'payer_id' => 'JARYJK2TES6C6',
  'tax' => '0.90',
  'address_street' => 'NO 1 Nan Jin Road',
  'payment_date' => '04:49:05 Dec 06, 2014 PST',
  'payment_status' => 'Completed',
  'charset' => 'gb2312',
  'address_zip' => '200000',
  'first_name' => 'Test',
  'mc_fee' => '2.20',
  'address_country_code' => 'CN',
  'address_name' => 'Buyer Test',
  'notify_version' => '3.8',
  'custom' => '',
  'payer_status' => 'unverified',
  'business' => 'yxw.2013.03-facilitator@gmail.com',
  'address_country' => 'China',
  'address_city' => 'Shanghai',
  'quantity' => '1',
  'verify_sign' => 'A7SNeSYl88fJlq0RDkCQ4EljfLsAAMJ6OYFDH1nYVB0-NYyynmZyPh.1',
  'payer_email' => 'xxx.2013.03-buyer@gmail.com',
  'txn_id' => '61P15910PR196164M',
  'payment_type' => 'instant',
  'btn_id' => '3042078',
  'last_name' => 'Buyer',
  'address_state' => 'Shanghai',
  'receiver_email' => 'xxx2013.03-facilitator@gmail.com',
  'payment_fee' => '2.20',
  'shipping_discount' => '0.00',
  'insurance_amount' => '0.00',
  'receiver_id' => '2XP27KEMUVN8A',
  'txn_type' => 'web_accept',
  'item_name' => 'sandbox_item111',
  'discount' => '0.00',
  'mc_currency' => 'USD',
  'item_number' => '',
  'residence_country' => 'CN',
  'test_ipn' => '1',
  'shipping_method' => 'Default',
  'handling_amount' => '0.00',
  'transaction_subject' => '',
  'payment_gross' => '55.90',
  'shipping' => '10.00',
  'ipn_track_id' => '755ef8ff304e1',
)
2014-12-06 20:49:16

[pig@ip-10-236-139-149 paytest]$ cat ipn.log
[2014-12-06 22:21 PRC] HTTP request of validation request:POST /cgi-bin/webscr HTTP/1.1
Host: www.sandbox.paypal.com
Accept: */*
Connection: Close
Content-Length: 1089
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

for IPN payload: cmd=_notify-validate&mc_gross=55.90&protection_eligibility=Eligible&address_status=unconfirmed&payer_id=JARYJK2TES6C6&tax=0.90&address_street=NO+1+Nan+Jin+Road&payment_date=06%3A21%3A54+Dec+06%2C+2014+PST&payment_status=Completed&charset=gb2312&address_zip=200000&first_name=Test&mc_fee=2.20&address_country_code=CN&address_name=Buyer+Test&notify_version=3.8&custom=&payer_status=unverified&business=yxw.2013.03-facilitator%40gmail.com&address_country=China&address_city=Shanghai&quantity=1&verify_sign=AUaxvSojqajxsiGA9qXfGuCulUctAIsI7u6BJGTRbntLsB6UI3lGIXb0&payer_email=yxw.2013.03-buyer%40gmail.com&txn_id=1TM13495A76848512&payment_type=instant&btn_id=3042078&last_name=Buyer&address_state=Shanghai&receiver_email=yxw.2013.03-facilitator%40gmail.com&payment_fee=2.20&shipping_discount=0.00&insurance_amount=0.00&receiver_id=2XP27KEMUVN8A&txn_type=web_accept&item_name=sandbox_item111&discount=0.00&mc_currency=USD&item_number=&residence_country=CN&test_ipn=1&shipping_method=Default&handling_amount=0.00&transaction_subject=&payment_gross=55.90&shipping=10.00&ipn_track_id=a6f9e0f859c1c
[2014-12-06 22:21 PRC] HTTP response of validation request: HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Sat, 06 Dec 2014 14:22:01 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Set-Cookie: c9MWDuvPtT9GIMyPc3jwol1VSlO=cHblkEi54DzGTLa5JlkZ5k5rwA9ZRS9I13Waw_UNEnN3n4qBax3-drCD_5VrYo1lvRJWmHQOPn7bYide5LEYmFvSQ-CEsd2RJH6JycTVU3-AiEY9dBVxSVYXMxP6eEtKoknENSGh-ppAYRKLbw40OnC7_FO57RDSBMB3ttpAXqan8xSmdvjcfpezvl3810OK51XEyiIkyXHYQiLTIVqDBJhpgPSAz5jcqGZSF-ZvJIXohmvOJekwuyAgf_R7-QmdEiZgjrG5-msjx2kn6ATUC4Cm-NFOsQgmKa0ecWhOgFEqzjgS8juVMHizUC786G3D0krGR0e5SLzNS9GwwzXk-fIkEzEO75dEoEre9VFK4TfMnygkrdtJV637BSwzqNYyULaF6dHFCTxeEeJ1Xrq9TI5sRssDxQdzcmfE8sCwKZ1L4bgH71CjkI0SU1i; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: cookie_check=yes; expires=Tue, 03-Dec-2024 14:22:02 GMT; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: navcmd=_notify-validate; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: navlns=0.0; expires=Mon, 05-Dec-2016 14:22:02 GMT; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: Apache=10.72.108.11.1417875722013081; path=/; expires=Mon, 28-Nov-44 14:22:02 GMT
Vary: Accept-Encoding,User-Agent
Connection: close
Set-Cookie: X-PP-SILOVER=name%3DSANDBOX3.WEB.1%26silo_version%3D880%26app%3Dslingshot%26TIME%3D168919892; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT
Set-Cookie: Apache=10.72.128.11.1417875721998036; path=/; expires=Mon, 28-Nov-44 14:22:01 GMT
Strict-Transport-Security: max-age=14400
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

VERIFIED
[2014-12-06 22:21 PRC] Verified IPN: cmd=_notify-validate&mc_gross=55.90&protection_eligibility=Eligible&address_status=unconfirmed&payer_id=JARYJK2TES6C6&tax=0.90&address_street=NO+1+Nan+Jin+Road&payment_date=06%3A21%3A54+Dec+06%2C+2014+PST&payment_status=Completed&charset=gb2312&address_zip=200000&first_name=Test&mc_fee=2.20&address_country_code=CN&address_name=Buyer+Test&notify_version=3.8&custom=&payer_status=unverified&business=yxw.2013.03-facilitator%40gmail.com&address_country=China&address_city=Shanghai&quantity=1&verify_sign=AUaxvSojqajxsiGA9qXfGuCulUctAIsI7u6BJGTRbntLsB6UI3lGIXb0&payer_email=yxw.2013.03-buyer%40gmail.com&txn_id=1TM13495A76848512&payment_type=instant&btn_id=3042078&last_name=Buyer&address_state=Shanghai&receiver_email=yxw.2013.03-facilitator%40gmail.com&payment_fee=2.20&shipping_discount=0.00&insurance_amount=0.00&receiver_id=2XP27KEMUVN8A&txn_type=web_accept&item_name=sandbox_item111&discount=0.00&mc_currency=USD&item_number=&residence_country=CN&test_ipn=1&shipping_method=Default&handling_amount=0.00&transaction_subject=&payment_gross=55.90&shipping=10.00&ipn_track_id=a6f9e0f859c1c

paypal IPN and PDT相关推荐

  1. paypal IPN and PDT 2

    当支付模式为快速支付(按钮)时,IPN 和PDT都会起作用, 当以Rest Api方式创建支付时, PDT是无效的,它应该是针对网站的,IPN依然起作用.调用Rest Api 付款的步骤是这样的: 1 ...

  2. php paypal ipn回调,php paypal ipn

    这个php paypal ipn到底怎么用的? 我网上找了很多代码,有人写好的类,直接就能调用就可以,底下回复也是可以用得. 为啥我用就不行呢?我在sandbox里面测试一直都不行啊! 是不是在san ...

  3. Paypal IPN

    网上已经有很多paypay ipn的文章了,只不过他们都是用paypal的购物车.因为我只是用来作为一个付款渠道,因此,我得先生成订单,然后引导客户去paypal付款. 1.转去付款页面 代码     ...

  4. paypal ipn java_PayPal IPN验证

    以下是来自PayPal订单管理集成指南: Processing the PayPal Response to Your Postback PayPal使用响应正文中的单个单词响应您的回发:VERIFI ...

  5. php paypal ipn回调,Paypal IPN / Webhook 异步回调流程是怎样的?

    里面提到的内容跟我遇到的差不多,我使用的是 Omnipay Paypal 包. 我之前直以为只要用户在 paypal 端完成支付,无论是否跳转回网站执行同步回调,IPN / Webhook 异步回调都 ...

  6. 使用PayPal补习注册(1/3):PDT和IPN流程

    抽象 本教程旨在介绍如何使注册过程与PayPal系统一起正常工作. 解释PayPal的工作方式(IPN和PDT流程). 第一章 举例说明如何使用PayPal注册,其中包含具有jQuery功能的数据库, ...

  7. PayPal开发之IPN的使用

    PayPal 快速.安全而又方便,是跨國交易的首選在線付款方式.現在PayPal可以和國內大部分信用卡關聯,可以實現國人的跨國交易收支. 申請PayPal註冊網址:https://www.paypal ...

  8. paypal pdt php 5.3,opencart经验分享-paypal的配置与PDT Token的获取 | SDT技术网

    网上看到很多PDT Token的获取方法,我一直很纠结,我一直在paypal里面找不到,后来才发现,他们说的应该是老版本的paypal的使用吧? 现在是这样的,一开始说的取消那个的我也不知道在哪里啦, ...

  9. 网站集成PayPal如何设置

    网站集成PayPal如何设置 登录 PAYPAL 网站 0. 注册 1. 登录. 2. 点击 Profile. 3. 点击 Add or Edit Email. 4. 记下 primary 邮件地址, ...

最新文章

  1. 猎豹MFC--列表控件ListControl
  2. python 线程锁 共享全局变量 线程通信
  3. 自己编写的MSN历史记录合并工具
  4. LaTeX入门第一集!LaTeX下载资源分享!LaTeX教学资源分享!TeXstudio下载资源分享!
  5. vi 命令linux退不出来,Linux 基本命令 vi的退出方法
  6. update-rc.d: error: XXX Default-Start contains no runlevels, aborting.
  7. python状态码409_HTTP状态码
  8. 苹果的Swift 2.0,Raspberry Pi Zero vs CHIP以及更多新闻
  9. php测试接口的小工具,PHP API接口测试小工具
  10. [JNI] 开发基础(3)指针操作
  11. java 设置session超时_Java设置session超时(失效)的时间
  12. Winform中 ListView控件的使用
  13. mysql连接服务器教程_连接 MySQL 服务器
  14. 消防报警图形显示装置linux,中级消防设施操作员考点:消防控制室图形显示装置...
  15. 深度强化学习-策略梯度算法推导
  16. 短视频如何添加封面图
  17. glutSwapBuffers()和glFlush()区别
  18. 盒子模型有时候会出现设置背景、边框无法撑大和设置内外间距异常,一般来说此类问题的原因是什么?
  19. 字模c语言,[C/C++]字模的解析(视频)
  20. Notepad++ 下载地址

热门文章

  1. Oracle数据库后端优化建议
  2. vc 6.0++解决兼容性及闪退问题
  3. 函数TEXT - EXCEL单元格中日期格式转换为文本格式
  4. Eclipse SVN文件对比详解
  5. @Validated规则校验和校验分组Group
  6. SAP中使用LSMW批量导入总账科目
  7. 数通基础-TCPIP参考模型
  8. Bugku - Misc图穷匕见 - Writeup
  9. 130:vue+openlayers 加载中国边界JSON数据(EPSG:4326)
  10. 我想成为一只IT小小鸟