Giter Site home page Giter Site logo

omnipay-alipay's Introduction

Omnipay: Alipay

travis Latest Version on Packagist Total Downloads Code Coverage Software License

Alipay driver for the Omnipay PHP payment processing library

Omnipay is a framework agnostic, multi-gateway payment processing library for PHP. This package implements Alipay support for Omnipay.

Cross-border Alipay payment please use lokielse/omnipay-global-alipay

Legacy Version please use "lokielse/omnipay-alipay": "dev-legacy"

Installation

composer require lokielse/omnipay-alipay

Basic Usage

The following gateways are provided by this package:

Gateway Description 说明   Links
Alipay_AopPage Alipay Page Gateway 电脑网站支付 - new Usage Doc
Alipay_AopApp Alipay APP Gateway APP支付 - new Usage Doc
Alipay_AopF2F Alipay Face To Face Gateway 当面付 - new Usage Doc
Alipay_AopWap Alipay WAP Gateway 手机网站支付 - new Usage Doc
Alipay_AopJs Alipay Js Gateway JSAPI - new Usage Doc
Alipay_LegacyApp Alipay Legacy APP Gateway APP支付 Usage Doc
Alipay_LegacyExpress Alipay Legacy Express Gateway 即时到账 Usage Doc
Alipay_LegacyWap Alipay Legacy WAP Gateway 手机网站支付 Usage Doc

Usage

Purchase (购买)

/**
 * @var AopAppGateway $gateway
 */
$gateway = Omnipay::create('Alipay_AopPage');
$gateway->setSignType('RSA2'); // RSA/RSA2/MD5. Use certificate mode must set RSA2
$gateway->setAppId('the_app_id');
$gateway->setPrivateKey('the_app_private_key');
$gateway->setAlipayPublicKey('the_alipay_public_key'); // Need not set this when used certificate mode
$gateway->setReturnUrl('https://www.example.com/return');
$gateway->setNotifyUrl('https://www.example.com/notify');

// Must set cert path if you used certificate mode
//$gateway->setAlipayRootCert('the_alipay_root_cert'); // alipayRootCert.crt
//$gateway->setAlipayPublicCert('the_alipay_public_cert'); // alipayCertPublicKey_RSA2.crt
//$gateway->setAppCert('the_app_public_cert'); // appCertPublicKey.crt
//$gateway->setCheckAlipayPublicCert(true);

/**
 * @var AopTradePagePayResponse $response
 */
$response = $gateway->purchase()->setBizContent([
    'subject'      => 'test',
    'out_trade_no' => date('YmdHis') . mt_rand(1000, 9999),
    'total_amount' => '0.01',
    'product_code' => 'FAST_INSTANT_TRADE_PAY',
])->send();

$url = $response->getRedirectUrl();

For general usage instructions, please see the

Related

Support

If you are having general issues with Omnipay, we suggest posting on Stack Overflow. Be sure to add the omnipay tag so it can be easily found.

If you want to keep up to date with release anouncements, discuss ideas for the project, or ask more detailed questions, there is also a mailing list which you can subscribe to.

If you believe you have found a bug, please report it using the GitHub issue tracker, or better yet, fork the library and submit a pull request.

omnipay-alipay's People

Contributors

aderuwe avatar amacneil avatar amsross avatar andywuzh avatar asaph avatar billwang22 avatar davesouthey avatar focus0802 avatar hogus2037 avatar hydrz avatar jianyan74 avatar johnkary avatar laraveler avatar lokielse avatar maclof avatar maxsky avatar michael2h4ng avatar michaeldoe avatar mtudor avatar nedmas avatar pborreli avatar pilot avatar rlerdorf avatar ruudk avatar shinvdu avatar skyred avatar steveneaston avatar tomaskit avatar willzwl avatar winzou avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

omnipay-alipay's Issues

Alipay_MobileExpress 返回给客户端的签名是错误的

公钥私钥都是正确的,就是ios客户端无法使用返回的签名。
iOS拿 $response->getOrderString() 后返回的参数,不用服务器返回的签名,自己签名是可以的。
貌似签名逻辑有问题,能看下吗?谢谢。

支付宝APP支付回调函数逻辑不通

代码如下:
`
Log::info('Alipay Notify request arrived.');
$gateway = Omnipay::create('Alipay_AopApp');
$gateway->setAppId('xxxxxx');
$gateway->setPrivateKey(File::get('../config/key/alipay/private_key.pem'));
$gateway->setAlipayPublicKey(File::get('../config/key/alipay/public_key.pem'));
$gateway->setNotifyUrl(NOTIFY_DOMAIN.'alipayNotify');

	Log::info('Alipay Notify gateway: '.json_encode($gateway));

	$request = $gateway->completePurchase();

	Log::info('Alipay Notify request: '.json_encode($request));
	
	$request->setParams($_POST);//Optional

	try {
		$response = $request->send();

		if($response->isPaid()){

			Log::info('Alipay Notify isPaid.'.json_encode($_POST));

			//支付成功,处理订单
			die($this->handle_order_success($sheet,$trade_no,1));
		}else{
			/**
			 * Payment is not successful
			 */
			die($this->alipayNotifyReturnfalse);
		}
	} catch (\Exception $e) {
		/**
		 * Payment is not successful
		 */
		die($this->alipayNotifyReturnfalse);
	}

`
支付已经成功,也已经进入了这个notify回调函数,但使用日志打印出$gateway和$request都为空,而且也无法进入$respoinse->isPaid()的判断里。但$_POST中已经有支付宝返回的所有成功数据,这里的不是很明白编写者的意图。

最新版 Laravel 安装问题

问题描述

执行composer** require lokielse/omnipay-alipay时出现版本冲突问题,类似如下

Your requirements could not be resolved to an installable set of package

  Problem 1
    - Conclusion: don't install lokielse/omnipay-alipay v2.0.3
    - Conclusion: don't install lokielse/omnipay-alipay v2.0.2
    - Conclusion: don't install lokielse/omnipay-alipay v2.0.1
    - Conclusion: remove symfony/event-dispatcher v3.1.4
    - Conclusion: don't install symfony/event-dispatcher v3.1.4
    - omnipay/common 2.4.0 requires guzzle/guzzle ~3.9 -> satisfiable by guzzle/
    - omnipay/common v2.3.4 requires guzzle/guzzle ~3.9 -> satisfiable by guzzle
    - omnipay/common v2.4.1 requires guzzle/guzzle ~3.9 -> satisfiable by guzzle
    - omnipay/common v2.5.0 requires guzzle/guzzle ~3.9 -> satisfiable by guzzle
    - omnipay/common v2.5.1 requires guzzle/guzzle ~3.9 -> satisfiable by guzzle
    - guzzle/guzzle v3.9.0 requires symfony/event-dispatcher ~2.1 -> satisfiable
v2.1.7, v2.1.8, v2.1.9, v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4
v2.3.17, v2.3.18, v2.3.19, v2.3.2, v2.3.20, v2.3.21, v2.3.22, v2.3.23, v2.3.24,
37, v2.3.38, v2.3.39, v2.3.4, v2.3.40, v2.3.41, v2.3.42, v2.3.5, v2.3.6, v2.3.7,
 v2.5.10, v2.5.11, v2.5.12, v2.5.2, v2.5.3, v2.5.4, v2.5.5, v2.5.6, v2.5.7, v2.5
2.6.9, v2.7.0, v2.7.1, v2.7.10, v2.7.11, v2.7.12, v2.7.13, v2.7.14, v2.7.15, v2.
 v2.8.10, v2.8.11, v2.8.12, v2.8.13, v2.8.2, v2.8.3, v2.8.4, v2.8.5, v2.8.6, v2.
    - guzzle/guzzle v3.9.1 requires symfony/event-dispatcher ~2.1 -> satisfiable
v2.1.7, v2.1.8, v2.1.9, v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4
v2.3.17, v2.3.18, v2.3.19, v2.3.2, v2.3.20, v2.3.21, v2.3.22, v2.3.23, v2.3.24,
37, v2.3.38, v2.3.39, v2.3.4, v2.3.40, v2.3.41, v2.3.42, v2.3.5, v2.3.6, v2.3.7,
 v2.5.10, v2.5.11, v2.5.12, v2.5.2, v2.5.3, v2.5.4, v2.5.5, v2.5.6, v2.5.7, v2.5
2.6.9, v2.7.0, v2.7.1, v2.7.10, v2.7.11, v2.7.12, v2.7.13, v2.7.14, v2.7.15, v2.
 v2.8.10, v2.8.11, v2.8.12, v2.8.13, v2.8.2, v2.8.3, v2.8.4, v2.8.5, v2.8.6, v2.
    - guzzle/guzzle v3.9.2 requires symfony/event-dispatcher ~2.1 -> satisfiable
v2.1.7, v2.1.8, v2.1.9, v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4
v2.3.17, v2.3.18, v2.3.19, v2.3.2, v2.3.20, v2.3.21, v2.3.22, v2.3.23, v2.3.24,
37, v2.3.38, v2.3.39, v2.3.4, v2.3.40, v2.3.41, v2.3.42, v2.3.5, v2.3.6, v2.3.7,
 v2.5.10, v2.5.11, v2.5.12, v2.5.2, v2.5.3, v2.5.4, v2.5.5, v2.5.6, v2.5.7, v2.5
2.6.9, v2.7.0, v2.7.1, v2.7.10, v2.7.11, v2.7.12, v2.7.13, v2.7.14, v2.7.15, v2.
 v2.8.10, v2.8.11, v2.8.12, v2.8.13, v2.8.2, v2.8.3, v2.8.4, v2.8.5, v2.8.6, v2.

web端调用发生ILLEGAL_SIGN错误

下面是我的配置,一直发现不了问题在哪
'alipay' => [
'driver' => 'Alipay_Express',
'options' => [
'partner' => '20882XXXXXXXX', //pid
'key' => 'XXXXXXXXXXXX',
'sellerEmail' =>'[email protected]',
'returnUrl' => 'http://test.app/alipay/return',
'notifyUrl' => 'http://test.app/alipay/notify'
]
]

银行支付时的setDefaultBank问题

使用银行支付时,必须要指定默认银行,我在代码中看到

public function purchase(array $parameters = array())
{
    $this->setService($this->service_name);
    $this->setParameter('paymethod', 'bankPay');
    if ($this->getParameter('defaultbank') === null) {
        throw new InvalidRequestException("The setDefaultBank(x) method is not called.");
    }
    return $this->createRequest('\Omnipay\Alipay\Message\ExpressPurchaseRequest', $parameters);
}

而我使用
public function setDefaultBank($value)
{
$this->setParameter('default_bank', $value);
}
时字段名为 default_bank ,导致二个key的名称不一致,是不是不是这样写的?

希望可以清理一下从omnipay引入的Tag,然后发布一个正式版本Tag

https://packagist.org/packages/lokielse/omnipay-alipay 中看到有很多版本,如v2.1.0,v1.1.0。
但是发现只有dev-master能用。其他版本应该是从omnipay中引入的吧?

能否清理一下呢?
因为在我们的项目里,要求每个依赖库都注明明确版本。不允许使用dev-master。这样是为了避免未经测试的更新造成线上环境不稳定。

这个库对我们的项目非常有帮助。期待您的消息。

支付宝APP支付回调抛出公钥不合法的异常

给予前端预付参数:
`
$gateway = Omnipay::create('Alipay_AopApp');
$gateway->setAppId('xxxxxxx');
$gateway->setPrivateKey(config_path('key/alipay/private_key.pem'));
$gateway->setAlipayPublicKey(config_path('key/alipay/public_key.pem'));
$gateway->setNotifyUrl(NOTIFY_DOMAIN.'alipayNotify');

	$request = $gateway->purchase();
	$request->setBizContent([
		'subject'      => '商品',
		'out_trade_no' => $sheet->sheetNumber,
		'total_amount' => $sheet->money,
		'product_code' => 'QUICK_MSECURITY_PAY',

	]);

	/**
	 * @var AopTradeAppPayResponse $response
	 */
	$response = $request->send();

	$orderString = $response->getOrderString();

支付回调Notify:
$gateway = Omnipay::create('Alipay_AopApp');
$gateway->setAppId('xxxxxxxx');
$gateway->setPrivateKey(config_path('key/alipay/private_key.pem'));
$gateway->setAlipayPublicKey(config_path('key/alipay/public_key.pem'));
$gateway->setNotifyUrl(NOTIFY_DOMAIN.'alipayNotify');

	$request = $gateway->completePurchase();
	$request->setParams($_POST);//Optional
	try {
		$response = $request->send();
		if($response->isPaid()){

			//支付成功,处理订单
			die($this->handle_order_success($sheet,$trade_no,1));
		}else{
			/**
			 * Payment is not successful
			 */
			die($this->alipayNotifyReturnfalse);
		}
	} catch (\Exception $e) {
		/**
		 * Payment is not successful
		 */
		Log::info('Alipay Notify catch fail.'.$e->getMessage());
		//die($this->alipayNotifyReturnfalse);
	}

`

回调函数抛出了异常,异常信息是“The publicKey is invalid ”,公钥不合法,不知道是不是setAlipayPublicKey方法传的内容不正确?但我试过传路径、传一行公钥字符串进去,均抛出上面的异常。暂未找到解决方法。。。

Composer Install failure

Hi,

When I try to composer install the package, it throws the following error

Problem 1
- The requested package lokielse/omnipay-alipay could not be found in any version, there may be a typo in the package name.

Best regards,
Prashant

同步验证的时候报错bug

            $gateway = \Omnipay::gateway ();
    $options['request_params'] = \Request::all();
    $options['sign_type']      = 'RSA';
    $options['ali_public_key']   = config_path('alipay_key/alipay_public_key.pem');
    $response                   = $gateway->completePurchase($options)->send();

报错如下
ErrorException in ExpressCompletePurchaseRequest.php line 297:
openssl_verify(): supplied key param cannot be coerced into a public key
in ExpressCompletePurchaseRequest.php line 297
at HandleExceptions->handleError('2', 'openssl_verify(): supplied key param cannot be coerced into a public key',

建议支付宝手机web支付增加参数 "app_pay" => "Y",

建议支付宝手机web支付增加参数 "app_pay" => "Y",
lokielse/omnipay-alipay/src/Message/WapExpressPurchaseRequest.php
$data = array( "service" => $this->getService(), "partner" => $this->getPartner(), "seller_id" => $this->getPartner(), "payment_type" => $this->getPaymentType(), "notify_url" => $this->getNotifyUrl(), "return_url" => $this->getReturnUrl(), "out_trade_no" => $this->getOutTradeNo(), "subject" => $this->getSubject(), "total_fee" => $this->getTotalFee(), "show_url" => $this->getShowUrl(), "body" => $this->getBody(), "it_b_pay" => $this->getItBPay(), "extern_token" => $this->getToken(), "_input_charset" => $this->getInputCharset(), "app_pay" => "Y", );
如此可以在移动端有更好的体验。调用已有的App支付

验证公钥的问题

ExpressCompletePurchaseRequest.php 196
getParamsSignature() 方法 在这里是要返回字符串吧,
因为在第242行,您是要将返回值与一个字符串做对比。
然而您返回的是boolen。

晕, defaul_tbank 打错了


    public function purchase(array $parameters = array())
    {
        $this->setService($this->service_name);
        $this->setParameter('paymethod', 'bankPay');
        if ($this->getParameter('defaul_tbank') === null) {
            throw new InvalidRequestException("The setDefaultBank(x) method is not called.");
        }
        return $this->createRequest('\Omnipay\Alipay\Message\ExpressPurchaseRequest', $parameters);
    }

是default_bank

手机端支付宝支付问题,

您好,openssl_sign(): supplied key param cannot be coerced into a private key。报这个错误,vendor\lokielse\omnipay-alipay\src\Common\Signer.php',这是什么问题啊?是有更新吗?

同步验证的生活一直报 Only scalar values are allowed for parameters

错误信息: Only scalar values are allowed for parameters

调用:
`$options = [
'request_params'=> array_merge($_POST, $_GET), //Don't use $_REQUEST for may contain $_COOKIE
];

$response = $gateway->completePurchase($options)->send();`
怎么破呢?是文档没更新么?

错误发生类:vendor/omnipay/common/src/Omnipay/Common/Message/AbstractRequest.php
` protected function setParameter($key, $value)
{
if (null !== $this->response) {
throw new RuntimeException('Request cannot be modified after it has been sent!');
}

    if (null !== $value && !is_scalar($value)) {
        throw new RuntimeException('Only scalar values are allowed for parameters');
    }

    $this->parameters->set($key, $value);

    return $this;
}`

ILLEGAL_PARTNER_EXTERFACE

Once I go to AliPay I see the following message. With some help from Google Translate:

调试错误,请回到请求来源地,重新发起请求。
错误代码 ILLEGAL_PARTNER_EXTERFACE
说明:如果您不是因为本接口集成调试而看见该错误提醒,请联系本次请求来源网站,本错误属于网站集成接口的错误。

Debug error, please return to the request source, re-initiate the request.
Error code ILLEGAL_PARTNER_EXTERFACE
Note: If you are not because of the interfaces integrated debugger and see the error reminder, please contact the source site this request, this error is a wrong site integrated interface.

I have Googled the issue and found that I can change

ExpressGateway -> $service_name = 'create_direct_pay_by_user';

to

ExpressGateway -> $service_name = 'create_forex_trade';

and then I see another error:

调试错误,请回到请求来源地,重新发起请求。
错误代码 ILLEGAL_SIGN
说明:如果您不是因为本接口集成调试而看见该错误提醒,请联系本次请求来源网站,本错误属于网站集成接口的错误。

Debug error, please return to the request source, re-initiate the request.
Error code ILLEGAL_SIGN
Note: If you are not because of the interfaces integrated debugger and see the error reminder, please contact the source site this request, this error is a wrong site integrated interface.

I have used the following credentials for testing:

'id'    => '2088111956092332',
'key'   => '136nflj7uu24i7v6cheubmpy0uav4tdx',
'email' => '[email protected]',

I am really stuck here. I will appreciate any help!

Fatal error: Cannot redeclare array_get() (previously declared in /src/Illuminate/Support/helpers.php:182)

Fatal error: Cannot redeclare array_get() (previously declared in /private/var/www/hwby/vendor/laravel/framework/src/Illuminate/Support/helpers.php:182) in /private/var/www/hwby/vendor/lokielse/omnipay-alipay/src/Common/helpers.php on line 32
PHP Fatal error: Cannot redeclare array_get() (previously declared in /private/var/www/hwby/vendor/laravel/framework/src/Illuminate/Support/helpers.php:182) in /private/var/www/hwby/vendor/lokielse/omnipay-alipay/src/Common/helpers.php on line 32

Please add function_exists function in helpers.php.

手机uc浏览器使用问题

在ios 上使用uc浏览器 进行及时到账支付 会跳转到一个支付宝页面 内容是 mmmmmmmmmmmlli 的页面
然后再 跳转支付 这是什么原因?

请教关于wap异步通知回来问题

       $gateway = Omnipay::create("Alipay_WapExpress");
        $gateway->setPartner(Config::get('pay.alipay.id'));
        $gateway->setKey(Config::get('pay.alipay.key'));
        $gateway->setSellerEmail(Config::get('pay.alipay.email'));
        $options['request_params'] = Input::all();

        //$options['ca_cert_path']   = storage_path() . '/cert/cacert.pem';
        $options['ca_cert_path']   = storage_path() . '/cert/alipay_public_key.pem';
        $options['private_key']    = storage_path() . '/cert/rsa_private_key.pem';
        $options['sign_type']      = 'MD5';
        $request                   = $gateway->completePurchase($options)->send();
        $out_trade_no = Input::get('out_trade_no');

报: openssl_private_decrypt(): key parameter is not a valid private key 异常,

        $options['ca_cert_path']   = storage_path() . '/cert/alipay_public_key.pem';
        $options['private_key']    = storage_path() . '/cert/rsa_private_key.pem';

这二个是这样写的吗?

需要一个新的tag~

我们看到master合并了一个pr,我们也遇到相同的问题。

希望可以给这个新版本打一个新tag,便于我们更新~

ca_cert_path不想填写,怎么办呢?

ExpressCompletePurchaseRequest 文件中的ca_cert_path不是必须填写的项,但是不填写会抛错,怎么办?
InvalidRequestException("The request_params.$key parameter is required");

ExpressCompletePurchaseRequest里参数getter setter问题

    public function getAliPubicKey()
    {
        return $this->getRequestParam('ali_public_key');
    }
    //为何set的时候和get的时候来自不同的地方,这导致拿不到ali_public_key
    //而如果放到request_params传进来,则导致参数验签时多了ali_public_key而失败
    public function setAliPubicKey($value)
    {
        return $this->setParameter('ali_public_key', $value);
    }

Alipay Sandbox

Hi,

Is it possible to use the Alipay Sandbox (testing) account with your alipay plugin? If not, could this be added as an enhancement?

Thanks

setService方法貌似不工作

Hi,

$gateway = Omnipay::create("Alipay_Express");
....
$gateway->setService("create_forex_trade");

我这样设置来使用国际版本,但是发起支付请求后,支付宝会返回如下的错误信息:

错误代码 ILLEGAL_PARTNER_EXTERFACE

如果将文件 https://github.com/lokielse/omnipay-alipay/blob/master/src/ExpressGateway.php
protected $service = 'create_direct_pay_by_user';

改成 protected $service = 'create_forex_trade';

就可以工作了。所以请问下,设置国际版的正确姿势是什么呢?

file://引起的openssl错误

前几天一个服务器出现了openssl_sign(): supplied key param cannot be coerced into a private key的错误,追溯到源码里面文件是用file://打开的 于是改用fopen打开文件就OK了,不知道是什么原因引起的。

alipay refund notify error

Class Omnipay\Alipay\Message\RefundNotifyResponse contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Omnipay\Common\Message\ResponseInterface::isSuccessful)

支付宝即时到账为什么变成legacy了

支付宝即时到账为什么变成legacy了?
我看你的文档里都加了legacy,去蚂蚁金服网站看了下列出的四种支付服务也没有“即时到账”了,是不是以后就不支持pc网页支付了,如果不用即时到账服务怎么用支付宝进行pc网页的支付?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.