├── requirements.txt ├── .gitignore ├── doc ├── _build │ ├── html │ │ ├── _static │ │ │ ├── custom.css │ │ │ ├── up.png │ │ │ ├── down.png │ │ │ ├── file.png │ │ │ ├── plus.png │ │ │ ├── comment.png │ │ │ ├── minus.png │ │ │ ├── ajax-loader.gif │ │ │ ├── down-pressed.png │ │ │ ├── up-pressed.png │ │ │ ├── comment-bright.png │ │ │ ├── comment-close.png │ │ │ ├── pygments.css │ │ │ ├── doctools.js │ │ │ ├── underscore.js │ │ │ ├── basic.css │ │ │ ├── alabaster.css │ │ │ ├── searchtools.js │ │ │ └── websupport.js │ │ ├── objects.inv │ │ ├── .buildinfo │ │ ├── _sources │ │ │ ├── index.rst.txt │ │ │ ├── WeChatResult.rst.txt │ │ │ └── WeChatPay.rst.txt │ │ ├── search.html │ │ ├── searchindex.js │ │ ├── index.html │ │ ├── genindex.html │ │ ├── WeChatResult.html │ │ └── WeChatPay.html │ └── doctrees │ │ ├── index.doctree │ │ ├── WeChatPay.doctree │ │ ├── WeChatResult.doctree │ │ └── environment.pickle ├── _templates │ └── author.html ├── Makefile ├── make.bat ├── index.rst ├── WeChatResult.rst ├── WeChatPay.rst └── conf.py ├── setup.cfg ├── setup.py ├── LICENSE.txt ├── README.md ├── examples.py └── wechatpay ├── models.py └── __init__.py /requirements.txt: -------------------------------------------------------------------------------- 1 | xmltodict 2 | requests 3 | dicttoxml 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .idea/* 3 | *.egg-info 4 | .DS_Store 5 | dist/ 6 | build/ 7 | -------------------------------------------------------------------------------- /doc/_build/html/_static/custom.css: -------------------------------------------------------------------------------- 1 | /* This file intentionally left blank. */ 2 | -------------------------------------------------------------------------------- /doc/_build/html/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/objects.inv -------------------------------------------------------------------------------- /doc/_build/html/_static/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/up.png -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file = README.md 3 | 4 | [upload_sphinx] 5 | upload-dir = doc/_build/html 6 | -------------------------------------------------------------------------------- /doc/_build/html/_static/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/down.png -------------------------------------------------------------------------------- /doc/_build/html/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/file.png -------------------------------------------------------------------------------- /doc/_build/html/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/plus.png -------------------------------------------------------------------------------- /doc/_build/doctrees/index.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/doctrees/index.doctree -------------------------------------------------------------------------------- /doc/_build/html/_static/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/comment.png -------------------------------------------------------------------------------- /doc/_build/html/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/minus.png -------------------------------------------------------------------------------- /doc/_build/doctrees/WeChatPay.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/doctrees/WeChatPay.doctree -------------------------------------------------------------------------------- /doc/_build/doctrees/WeChatResult.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/doctrees/WeChatResult.doctree -------------------------------------------------------------------------------- /doc/_build/doctrees/environment.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/doctrees/environment.pickle -------------------------------------------------------------------------------- /doc/_build/html/_static/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/ajax-loader.gif -------------------------------------------------------------------------------- /doc/_build/html/_static/down-pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/down-pressed.png -------------------------------------------------------------------------------- /doc/_build/html/_static/up-pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/up-pressed.png -------------------------------------------------------------------------------- /doc/_build/html/_static/comment-bright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/comment-bright.png -------------------------------------------------------------------------------- /doc/_build/html/_static/comment-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yucheng-Ren/wechat-pay/HEAD/doc/_build/html/_static/comment-close.png -------------------------------------------------------------------------------- /doc/_build/html/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 43257e6e17e1415733a398cf8ab753e5 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /doc/_templates/author.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | About 6 | 7 | 8 | 9 | Author: Zack Ren 10 |
11 | Email: m6106918@gmail.com 12 | 13 | 14 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup( 4 | name='wechat-pay-sdk', 5 | packages=['wechatpay'], 6 | version='0.6.2', 7 | description='A sdk for wechat pay', 8 | author='Zack Ren', 9 | license='MIT', 10 | include_package_data=True, 11 | author_email='m6106918@gmail.com', 12 | url='https://github.com/Narcissist1/wechat-pay', 13 | download_url='https://github.com/Narcissist1/wechat-pay/archive/0.1.tar.gz', 14 | keywords=['wechat', 'pay'], 15 | classifiers=[], 16 | install_requires=[ 17 | 'xmltodict', 18 | 'requests', 19 | 'dicttoxml', 20 | ] 21 | ) 22 | -------------------------------------------------------------------------------- /doc/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SPHINXPROJ = wechat-pay-sdk 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /doc/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | set SPHINXPROJ=wechat-pay-sdk 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 20 | echo.installed, then set the SPHINXBUILD environment variable to point 21 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 22 | echo.may add the Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Zack Ren 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wechat-pay 2 | wechat pay sdk in python 3 | 4 | This is an unofficial sdk for WeChat Pay 5 | 6 | [WeChat Pay official API doc](https://pay.weixin.qq.com/wiki/doc/api/index.html) 7 | 8 | [Doc for this project](https://wechat-pay-sdk.readthedocs.io/en/latest/) 9 | 10 | install by pip 11 | 12 | pip install wechat-pay-sdk 13 | 14 | install from source 15 | 16 | python setup.py install 17 | 18 | Usage: 19 | 20 | ```py 21 | from wechatpay import WeChatPay 22 | 23 | WECHAT_APPID = 'your_app_id' 24 | WECHAT_MCH_ID = 'your_mch_id' 25 | WECHAT_NOTIFY_URL = 'your_notify_url' 26 | WECHAT_PAY_SECRET = 'your_pay_secret' 27 | WECHAT_CERT = 'path/to/your_cert.pem' 28 | WECHAT_KEY = 'patch/to/your_key.pem' 29 | 30 | 31 | sp = WeChatPay(WECHAT_APPID, WECHAT_MCH_ID, 32 | WECHAT_NOTIFY_URL, WECHAT_PAY_SECRET, WECHAT_CERT, WECHAT_KEY) 33 | 34 | # 统一下单 35 | result = sp.unifiedorder(body=body, out_trade_no=out_trade_no, total_fee=total_fee, 36 | spbill_create_ip=client_ip) 37 | 38 | # 查询订单 39 | result = sp.query_order(out_trade_no=out_trade_no) 40 | 41 | if result.success: 42 | # your code 43 | pass 44 | 45 | ``` 46 | 47 | -------------------------------------------------------------------------------- /examples.py: -------------------------------------------------------------------------------- 1 | from wechatpay import WeChatPay 2 | 3 | WECHAT_APPID = 'your_app_id' 4 | WECHAT_MCH_ID = 'your_mch_id' 5 | WECHAT_NOTIFY_URL = 'your_notify_url' 6 | WECHAT_PAY_SECRET = 'your_pay_secret' 7 | WECHAT_CERT = 'path/to/your_cert.pem' 8 | WECHAT_KEY = 'patch/to/your_key.pem' 9 | 10 | 11 | sp = WeChatPay(WECHAT_APPID, WECHAT_MCH_ID, 12 | WECHAT_NOTIFY_URL, WECHAT_PAY_SECRET, WECHAT_CERT, WECHAT_KEY) 13 | 14 | 15 | def unifiedorder(out_trade_no, body, total_fee, client_ip): 16 | ''' 17 | :param out_trade_no: your order id, should be unique in your system 18 | :param body: order description 19 | :param total_fee: order price 20 | :param client_ip: request ip address 21 | :return: 22 | ''' 23 | result = sp.unifiedorder(body=body, out_trade_no=out_trade_no, total_fee=total_fee, 24 | spbill_create_ip=client_ip) 25 | if result.success: 26 | # Qr code url 27 | return result.code_url 28 | else: 29 | return result.error_msg 30 | 31 | 32 | def query_order(out_trade_no): 33 | result = sp.query_order(out_trade_no=out_trade_no) 34 | if result.success: 35 | order_state = result.trade_state 36 | return order_state 37 | else: 38 | return result.error_msg 39 | -------------------------------------------------------------------------------- /doc/index.rst: -------------------------------------------------------------------------------- 1 | .. wechat-pay-sdk documentation master file, created by 2 | sphinx-quickstart on Tue Dec 19 18:32:24 2017. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to wechat-pay-sdk's documentation! 7 | ****************************************** 8 | 9 | wechat-pay-sdk is an unofficial sdk for WeChat pay. It contains almost all API of WeChat pay. 10 | 11 | Code host at `Github `_ 12 | 13 | Install WeChat-Pay-SDK 14 | ====================== 15 | Install with **pip**: 16 | 17 | ``pip install wechat-pay-sdk`` 18 | 19 | Or 20 | 21 | Install from source 22 | 23 | ``python setup.py install`` 24 | 25 | 26 | How To Use 27 | ========== 28 | 29 | Import the WeChatPay class and init it with your own parameters:: 30 | 31 | from wechatpay import WeChatPay 32 | 33 | WECHAT_APPID = 'your_app_id' 34 | WECHAT_MCH_ID = 'your_mch_id' 35 | WECHAT_NOTIFY_URL = 'your_notify_url' 36 | WECHAT_PAY_SECRET = 'your_pay_secret' 37 | WECHAT_CERT = 'path/to/your_cert.pem' 38 | WECHAT_KEY = 'patch/to/your_key.pem' 39 | 40 | 41 | sp = WeChatPay(WECHAT_APPID, WECHAT_MCH_ID, 42 | WECHAT_NOTIFY_URL, WECHAT_PAY_SECRET, WECHAT_CERT, WECHAT_KEY) 43 | 44 | # post order 45 | result = sp.unifiedorder(body=body, out_trade_no=out_trade_no, total_fee=total_fee, 46 | spbill_create_ip=client_ip) 47 | 48 | # order query 49 | result = sp.query_order(out_trade_no=out_trade_no) 50 | 51 | 52 | # download bills 53 | result = sp.downloadbill(bill_date=bill_date, bill_type=bill_type) 54 | 55 | # refund (this method need your cert.pem and key.pem file which need you to download from the official website) 56 | result = sp.refund(out_trade_no, out_refund_no, total_fee, total_fee) 57 | 58 | # refund query 59 | result = sp.refund_query(out_trade_no) 60 | 61 | if result.success: 62 | # your code 63 | pass 64 | 65 | API 66 | === 67 | .. toctree:: 68 | :maxdepth: 2 69 | 70 | WeChatPay 71 | WeChatResult 72 | 73 | Indices and tables 74 | ================== 75 | 76 | * :ref:`genindex` 77 | * :ref:`search` 78 | -------------------------------------------------------------------------------- /doc/_build/html/_sources/index.rst.txt: -------------------------------------------------------------------------------- 1 | .. wechat-pay-sdk documentation master file, created by 2 | sphinx-quickstart on Tue Dec 19 18:32:24 2017. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to wechat-pay-sdk's documentation! 7 | ****************************************** 8 | 9 | wechat-pay-sdk is an unofficial sdk for WeChat pay. It contains almost all API of WeChat pay. 10 | 11 | Code host at `Github `_ 12 | 13 | Install WeChat-Pay-SDK 14 | ====================== 15 | Install with **pip**: 16 | 17 | ``pip install wechat-pay-sdk`` 18 | 19 | Or 20 | 21 | Install from source 22 | 23 | ``python setup.py install`` 24 | 25 | 26 | How To Use 27 | ========== 28 | 29 | Import the WeChatPay class and init it with your own parameters:: 30 | 31 | from wechatpay import WeChatPay 32 | 33 | WECHAT_APPID = 'your_app_id' 34 | WECHAT_MCH_ID = 'your_mch_id' 35 | WECHAT_NOTIFY_URL = 'your_notify_url' 36 | WECHAT_PAY_SECRET = 'your_pay_secret' 37 | WECHAT_CERT = 'path/to/your_cert.pem' 38 | WECHAT_KEY = 'patch/to/your_key.pem' 39 | 40 | 41 | sp = WeChatPay(WECHAT_APPID, WECHAT_MCH_ID, 42 | WECHAT_NOTIFY_URL, WECHAT_PAY_SECRET, WECHAT_CERT, WECHAT_KEY) 43 | 44 | # post order 45 | result = sp.unifiedorder(body=body, out_trade_no=out_trade_no, total_fee=total_fee, 46 | spbill_create_ip=client_ip) 47 | 48 | # order query 49 | result = sp.query_order(out_trade_no=out_trade_no) 50 | 51 | 52 | # download bills 53 | result = sp.downloadbill(bill_date=bill_date, bill_type=bill_type) 54 | 55 | # refund (this method need your cert.pem and key.pem file which need you to download from the official website) 56 | result = sp.refund(out_trade_no, out_refund_no, total_fee, total_fee) 57 | 58 | # refund query 59 | result = sp.refund_query(out_trade_no) 60 | 61 | if result.success: 62 | # your code 63 | pass 64 | 65 | API 66 | === 67 | .. toctree:: 68 | :maxdepth: 2 69 | 70 | WeChatPay 71 | WeChatResult 72 | 73 | Indices and tables 74 | ================== 75 | 76 | * :ref:`genindex` 77 | * :ref:`search` 78 | -------------------------------------------------------------------------------- /doc/WeChatResult.rst: -------------------------------------------------------------------------------- 1 | 2 | WeChatResult 3 | ============ 4 | 5 | .. py:class:: WeChatResult(resp) 6 | 7 | .. py:attribute:: resp 8 | 9 | resp is the instance of Response class from `requests `_ 10 | 11 | .. py:attribute:: success 12 | 13 | success is used to determine whether this request is successful 14 | 15 | .. py:attribute:: result 16 | 17 | result is a python dict which contains the response data that parsed from xml 18 | 19 | .. py:attribute:: error_msg 20 | 21 | error_msg contains the error message if anything went wrong 22 | 23 | 24 | .. py:class:: UnifiedorderResult(WeChatResult) 25 | 26 | .. py:attribute:: trade_type 27 | 28 | `(JSAPI,NATIVE,APP) `_ 29 | 30 | .. py:attribute:: prepay_id 31 | 32 | generate by WeChat for more operation (valid in 2 hours) 33 | 34 | .. py:attribute:: code_url 35 | 36 | Qr code url for payment 37 | 38 | 39 | .. py:class:: NotifyResult(WeChatResult) 40 | 41 | Every key in result dict refer to a attribute of this class 42 | `API `_ 43 | 44 | 45 | .. py:class:: ErrorResult(WeChatResult) 46 | 47 | .. py:attribute:: success 48 | 49 | in this case success is False 50 | 51 | .. py:attribute:: error_msg 52 | 53 | error message dict 54 | 55 | 56 | .. py:class:: SendBoxKey(WeChatResult) 57 | 58 | .. py:attribute:: key 59 | 60 | send box secret key 61 | 62 | 63 | .. py:class:: OrderResult(WeChatResult) 64 | 65 | .. py:attribute:: trade_state 66 | 67 | the state of this order 68 | 69 | .. py:attribute:: out_trade_no 70 | 71 | order id 72 | 73 | .. py:attribute:: total_fee 74 | 75 | amount of fee of this order 76 | 77 | .. py:class:: DownLoadBillResult(WeChatResult) 78 | 79 | .. py:attribute:: text 80 | 81 | unicode of the bill content 82 | 83 | .. py:attribute:: content 84 | 85 | bill content 86 | 87 | .. py:class:: CloseOrderResult(WeChatResult) 88 | 89 | pass 90 | 91 | 92 | .. py:class:: ShortUrlResult(WeChatResult) 93 | 94 | .. py:attribute:: short_url 95 | 96 | short url 97 | 98 | 99 | .. py:class:: RefundResult(WeChatResult) 100 | 101 | Every key in result dict refer to a attribute of this class 102 | 103 | `API `_ 104 | 105 | 106 | .. py:class:: RefundQueryResult(WeChatResult) 107 | 108 | `API `_ 109 | 110 | Because there are some field need to access by index, so use the result dict to fetch the data you need 111 | -------------------------------------------------------------------------------- /doc/_build/html/_sources/WeChatResult.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | WeChatResult 3 | ============ 4 | 5 | .. py:class:: WeChatResult(resp) 6 | 7 | .. py:attribute:: resp 8 | 9 | resp is the instance of Response class from `requests `_ 10 | 11 | .. py:attribute:: success 12 | 13 | success is used to determine whether this request is successful 14 | 15 | .. py:attribute:: result 16 | 17 | result is a python dict which contains the response data that parsed from xml 18 | 19 | .. py:attribute:: error_msg 20 | 21 | error_msg contains the error message if anything went wrong 22 | 23 | 24 | .. py:class:: UnifiedorderResult(WeChatResult) 25 | 26 | .. py:attribute:: trade_type 27 | 28 | `(JSAPI,NATIVE,APP) `_ 29 | 30 | .. py:attribute:: prepay_id 31 | 32 | generate by WeChat for more operation (valid in 2 hours) 33 | 34 | .. py:attribute:: code_url 35 | 36 | Qr code url for payment 37 | 38 | 39 | .. py:class:: NotifyResult(WeChatResult) 40 | 41 | Every key in result dict refer to a attribute of this class 42 | `API `_ 43 | 44 | 45 | .. py:class:: ErrorResult(WeChatResult) 46 | 47 | .. py:attribute:: success 48 | 49 | in this case success is False 50 | 51 | .. py:attribute:: error_msg 52 | 53 | error message dict 54 | 55 | 56 | .. py:class:: SendBoxKey(WeChatResult) 57 | 58 | .. py:attribute:: key 59 | 60 | send box secret key 61 | 62 | 63 | .. py:class:: OrderResult(WeChatResult) 64 | 65 | .. py:attribute:: trade_state 66 | 67 | the state of this order 68 | 69 | .. py:attribute:: out_trade_no 70 | 71 | order id 72 | 73 | .. py:attribute:: total_fee 74 | 75 | amount of fee of this order 76 | 77 | .. py:class:: DownLoadBillResult(WeChatResult) 78 | 79 | .. py:attribute:: text 80 | 81 | unicode of the bill content 82 | 83 | .. py:attribute:: content 84 | 85 | bill content 86 | 87 | .. py:class:: CloseOrderResult(WeChatResult) 88 | 89 | pass 90 | 91 | 92 | .. py:class:: ShortUrlResult(WeChatResult) 93 | 94 | .. py:attribute:: short_url 95 | 96 | short url 97 | 98 | 99 | .. py:class:: RefundResult(WeChatResult) 100 | 101 | Every key in result dict refer to a attribute of this class 102 | 103 | `API `_ 104 | 105 | 106 | .. py:class:: RefundQueryResult(WeChatResult) 107 | 108 | `API `_ 109 | 110 | Because there are some field need to access by index, so use the result dict to fetch the data you need 111 | -------------------------------------------------------------------------------- /doc/_build/html/search.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | Search — wechat-pay-sdk 0.4 documentation 9 | 10 | 11 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 |
46 |
47 |
48 | 49 |

Search

50 |
51 | 52 |

53 | Please activate JavaScript to enable the search 54 | functionality. 55 |

56 |
57 |

58 | From here you can search these documents. Enter your search 59 | words into the box below and click "search". Note that the search 60 | function will automatically search for all of the words. Pages 61 | containing fewer words won't appear in the result list. 62 |

63 |
64 | 65 | 66 | 67 |
68 | 69 |
70 | 71 |
72 | 73 |
74 |
75 |
76 | 105 |
106 |
107 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /doc/_build/html/searchindex.js: -------------------------------------------------------------------------------- 1 | Search.setIndex({docnames:["WeChatPay","WeChatResult","index"],envversion:52,filenames:["WeChatPay.rst","WeChatResult.rst","index.rst"],objects:{"":{CloseOrderResult:[1,0,1,""],DownLoadBillResult:[1,0,1,""],ErrorResult:[1,0,1,""],NotifyResult:[1,0,1,""],OrderResult:[1,0,1,""],RefundQueryResult:[1,0,1,""],RefundResult:[1,0,1,""],SendBoxKey:[1,0,1,""],ShortUrlResult:[1,0,1,""],UnifiedorderResult:[1,0,1,""],WeChatPay:[0,0,1,""],WeChatResult:[1,0,1,""]},DownLoadBillResult:{content:[1,1,1,""],text:[1,1,1,""]},ErrorResult:{error_msg:[1,1,1,""],success:[1,1,1,""]},OrderResult:{out_trade_no:[1,1,1,""],total_fee:[1,1,1,""],trade_state:[1,1,1,""]},SendBoxKey:{key:[1,1,1,""]},ShortUrlResult:{short_url:[1,1,1,""]},UnifiedorderResult:{code_url:[1,1,1,""],prepay_id:[1,1,1,""],trade_type:[1,1,1,""]},WeChatPay:{close_order:[0,2,1,""],downloadbill:[0,2,1,""],query_order:[0,2,1,""],random_str:[0,2,1,""],refund:[0,2,1,""],refund_query:[0,2,1,""],sendbox_sign:[0,2,1,""],short_url:[0,2,1,""],to_xml:[0,2,1,""],unifiedorder:[0,2,1,""],verify_notify:[0,2,1,""]},WeChatResult:{error_msg:[1,1,1,""],resp:[1,1,1,""],result:[1,1,1,""],success:[1,1,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"]},objtypes:{"0":"py:class","1":"py:attribute","2":"py:method"},terms:{"12_1":[],"23_1":[],"4_2":[],"9_1":[],"9_2":[],"9_3":[],"9_6":[],"case":1,"class":[0,1,2],"import":2,"long":0,"new":0,"return":0,"short":[0,1],access:1,account:0,address:0,all:[0,2],almost:2,amount:[0,1],anyth:1,api:[0,1],app:[0,1],appid:0,asd:[],attach:0,attribut:1,becaus:1,bill:[0,1,2],bill_dat:[0,2],bill_typ:[0,2],bodi:[0,2],box:1,cert:[0,2],chapter:[],client:0,client_ip:2,close:0,close_ord:0,closeorderresult:[0,1],cny:0,code:[0,1,2],code_url:1,com:[],contain:[1,2],content:1,convert:0,currenc:0,data:[0,1],date:0,dct:0,descript:0,detail:0,determin:1,device_info:0,dict:[0,1],dir:[],discount:0,doc:[],download:[0,2],downloadbil:[0,2],downloadbillresult:[0,1],error:1,error_msg:1,errorresult:[0,1],everi:1,except:0,expir:0,fals:1,fee:[0,1],fee_typ:0,fetch:1,field:1,file:[0,2],form:0,format:0,frame:[],from:[0,1,2],gener:[0,1],github:2,goods_tag:0,gzip:0,here:[],hmac:0,host:2,hour:1,http:[],implement:[],index:[1,2],info:0,inform:0,init:2,instanc:1,integ:[],item:0,jsapi:[0,1],kei:[0,1,2],kwarg:0,limit:[],limit_pai:0,list:[],long_url:0,make:0,master:[],maxdepth:[],maximum:[],mch_id:0,md5:0,messag:1,method:[0,2],model:[],modul:[],more:[0,1],narcissist1:[],nativ:[0,1],need:[0,1,2],no_credit:0,none:0,notif:0,notify_url:0,notifyresult:[0,1],number:[],object:0,offici:2,offset:0,one:0,onli:0,openid:0,oper:1,order:[0,1,2],orderresult:[0,1],org:[],out_refund_no:[0,2],out_trade_no:[0,1,2],own:2,page:2,pai:[],param:0,paramet:[0,2],pars:1,pass:[1,2],patch:2,path:2,pay_secret:0,payment:[0,1],pem:[0,2],php:[],pip:2,post:2,prepay_id:1,process:0,product_id:0,proid:0,python:[1,2],queri:[0,2],query_ord:[0,2],random:0,random_str:0,reason:0,recharge_refund:0,recogniz:0,refer:1,refund:[0,2],refund_account:0,refund_desc:0,refund_fe:0,refund_fee_typ:0,refund_id:0,refund_queri:[0,2],refundqueryresult:[0,1],refundresult:[0,1],req:0,request:[0,1],resp:1,respons:1,result:[1,2],rtype:0,scenario:0,scene_info:0,search:2,secret:[0,1],send:[0,1],sendbox:0,sendbox_sign:0,sendboxkei:[0,1],setup:2,sha256:0,short_url:[0,1],shorturlresult:[0,1],should:0,show:[],sign:0,sign_typ:0,some:1,sourc:2,sp_coupon:[],spbill_create_ip:[0,2],stack:[],state:1,string:0,success:[0,1,2],system:0,tar:0,tar_typ:0,text:1,thi:[0,1,2],time:0,time_expir:0,time_start:0,to_xml:0,tool:[],total:0,total_fe:[0,1,2],traceback:[],trade_st:1,trade_typ:[0,1],transaction_id:0,transfer:0,type:0,unicod:1,unifiedord:[0,2],unifiedorderresult:[0,1],uniqu:0,unoffici:2,url:[0,1],use:1,used:1,user:0,valid:1,verifi:0,verify_notifi:0,websit:2,wechat:[0,1],wechat_appid:2,wechat_cert:2,wechat_kei:2,wechat_mch_id:2,wechat_notify_url:2,wechat_pay_secret:2,wechatpai:2,wechatresult:2,weixin:[],went:1,whether:1,which:[1,2],wiki:[],wrong:1,xml:[0,1],you:[0,1,2],your:[0,2],your_app_id:2,your_cert:2,your_kei:2,your_mch_id:2,your_notify_url:2,your_pay_secret:2,yyyymmdd:0,yyyymmddhhmmss:0},titles:["WeChatPay","WeChatResult","Welcome to wechat-pay-sdk\u2019s documentation!"],titleterms:{Use:2,api:2,document:2,how:2,indic:2,instal:2,pai:2,sdk:2,tabl:2,unifiedord:[],use:[],wechat:2,wechatpai:0,wechatresult:1,welcom:2}}) -------------------------------------------------------------------------------- /doc/_build/html/_static/pygments.css: -------------------------------------------------------------------------------- 1 | .highlight .hll { background-color: #ffffcc } 2 | .highlight { background: #eeffcc; } 3 | .highlight .c { color: #408090; font-style: italic } /* Comment */ 4 | .highlight .err { border: 1px solid #FF0000 } /* Error */ 5 | .highlight .k { color: #007020; font-weight: bold } /* Keyword */ 6 | .highlight .o { color: #666666 } /* Operator */ 7 | .highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ 8 | .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ 9 | .highlight .cp { color: #007020 } /* Comment.Preproc */ 10 | .highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ 11 | .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ 12 | .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ 13 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 14 | .highlight .ge { font-style: italic } /* Generic.Emph */ 15 | .highlight .gr { color: #FF0000 } /* Generic.Error */ 16 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 17 | .highlight .gi { color: #00A000 } /* Generic.Inserted */ 18 | .highlight .go { color: #333333 } /* Generic.Output */ 19 | .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ 20 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 21 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 22 | .highlight .gt { color: #0044DD } /* Generic.Traceback */ 23 | .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ 24 | .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ 25 | .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ 26 | .highlight .kp { color: #007020 } /* Keyword.Pseudo */ 27 | .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ 28 | .highlight .kt { color: #902000 } /* Keyword.Type */ 29 | .highlight .m { color: #208050 } /* Literal.Number */ 30 | .highlight .s { color: #4070a0 } /* Literal.String */ 31 | .highlight .na { color: #4070a0 } /* Name.Attribute */ 32 | .highlight .nb { color: #007020 } /* Name.Builtin */ 33 | .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ 34 | .highlight .no { color: #60add5 } /* Name.Constant */ 35 | .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ 36 | .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ 37 | .highlight .ne { color: #007020 } /* Name.Exception */ 38 | .highlight .nf { color: #06287e } /* Name.Function */ 39 | .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ 40 | .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ 41 | .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ 42 | .highlight .nv { color: #bb60d5 } /* Name.Variable */ 43 | .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ 44 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 45 | .highlight .mb { color: #208050 } /* Literal.Number.Bin */ 46 | .highlight .mf { color: #208050 } /* Literal.Number.Float */ 47 | .highlight .mh { color: #208050 } /* Literal.Number.Hex */ 48 | .highlight .mi { color: #208050 } /* Literal.Number.Integer */ 49 | .highlight .mo { color: #208050 } /* Literal.Number.Oct */ 50 | .highlight .sa { color: #4070a0 } /* Literal.String.Affix */ 51 | .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ 52 | .highlight .sc { color: #4070a0 } /* Literal.String.Char */ 53 | .highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ 54 | .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ 55 | .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ 56 | .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ 57 | .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ 58 | .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ 59 | .highlight .sx { color: #c65d09 } /* Literal.String.Other */ 60 | .highlight .sr { color: #235388 } /* Literal.String.Regex */ 61 | .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ 62 | .highlight .ss { color: #517918 } /* Literal.String.Symbol */ 63 | .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ 64 | .highlight .fm { color: #06287e } /* Name.Function.Magic */ 65 | .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ 66 | .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ 67 | .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ 68 | .highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ 69 | .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /doc/WeChatPay.rst: -------------------------------------------------------------------------------- 1 | 2 | WeChatPay 3 | ========= 4 | 5 | .. py:class:: WeChatPay(appid, mch_id, notify_url, pay_secret, cert=None, key=None) 6 | 7 | .. py:method:: unifiedorder(device_info, sign_type, fee_type, trade_type, **kwargs) 8 | 9 | Form a new order. more information at 10 | `API `_ 11 | 12 | :param device_info: exception type 13 | :param sign_type: sign method(MD5 or HMAC-SHA256) 14 | :param fee_type: currency type 15 | :param attach: attach data 16 | :param out_trade_no: order id (should be unique in your system) 17 | :param trade_type: `(JSAPI,NATIVE,APP) `_ 18 | :param body: order description 19 | :param detail: item detail 20 | :param total_fee: the amount of fee 21 | :param spbill_create_ip: client ip address 22 | :param time_start: order generate time (format yyyyMMddHHmmss) 23 | :param time_expire: order expire time (format yyyyMMddHHmmss) 24 | :param goods_tag: `discount info `_ 25 | :param product_id: item id 26 | :param limit_pay: no_credit 27 | :param openid: user wechat openid 28 | :param scene_info: scenario info 29 | :rtype: :py:class:`UnifiedorderResult` 30 | 31 | .. py:method:: random_str() 32 | 33 | Generate a random string 34 | 35 | :rtype: string 36 | 37 | .. py:method:: verify_notify(req) 38 | 39 | Verify WeChat payment notification 40 | 41 | :param req: Request object from requests 42 | :rtype: :py:class:`NotifyResult` or :py:class:`ErrorResult` 43 | 44 | .. py:method:: to_xml(dct) 45 | 46 | Transfer a dict to xml string 47 | :param dct: data dict to send 48 | :rtype: string 49 | 50 | .. py:method:: sendbox_sign() 51 | 52 | Generate sendbox secret key 53 | `API `_ 54 | 55 | :rtype: :py:class:`SendBoxKey` 56 | 57 | 58 | .. py:method:: query_order(**kwargs) 59 | 60 | Query order from WeChat 61 | `API `_ 62 | 63 | :param transaction_id: wechat order id 64 | :param out_trade_no: order id (transaction_id and out_trade_no only need one) 65 | :rtype: :py:class:`OrderResult` 66 | 67 | .. py:method:: downloadbill(bill_date, sign_type='MD5', bill_type='ALL', tar_type='GZIP') 68 | 69 | Download bills 70 | `API `_ 71 | 72 | :param bill_date: the date of bill (format yyyymmdd) 73 | :param bill_type: the type of bill (ALL, SUCCESS, REFUND, RECHARGE_REFUND) 74 | :param tar_type: tar type(GZIP) 75 | :rtype: :py:class:`DownLoadBillResult` 76 | 77 | .. py:method:: close_order(out_trade_no, sign_type='MD5') 78 | 79 | Close order 80 | `API `_ 81 | 82 | :param out_trade_no: order id 83 | :rtype: :py:class:`CloseOrderResult` 84 | 85 | .. py:method:: short_url(long_url, sign_type='MD5') 86 | 87 | Convert long url to short url and make the Qr code more recognizable 88 | `API `_ 89 | 90 | :param long_url: long url 91 | :rtype: :py:class:`ShortUrlResult` 92 | 93 | .. py:method:: refund(out_trade_no, out_refund_no, total_fee, refund_fee, sign_type='MD5', refund_fee_type='CNY', **kwargs) 94 | 95 | Method for refund 96 | **this method need you to proide your cert.pem and key.pem file** 97 | `API `_ 98 | 99 | :param transaction_id: wechat order id 100 | :param out_trade_no: order id (transaction_id and out_trade_no only need one) 101 | :param out_refund_no: refund id 102 | :param total_fee: total order fee 103 | :param refund_fee: refund total fee 104 | :param refund_fee_type: currency type (CNY) 105 | :param refund_desc: refund reason 106 | :param refund_account: refund account 107 | :rtype: :py:class::`RefundResult` 108 | 109 | .. py:method:: refund_query(out_refund_no, sign_type='MD5', **kwargs) 110 | 111 | Query refund process 112 | `API `_ 113 | :param transaction_id: wechat order id 114 | :param out_trade_no: order id 115 | :param out_refund_no: refund id 116 | :param refund_id: refund id from WeChat (transaction_id, out_trade_no, out_refund_no, refund_id only need to one) 117 | :param offset: query offset 118 | :rtype: :py:class::`RefundQueryResult` 119 | -------------------------------------------------------------------------------- /doc/_build/html/_sources/WeChatPay.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | WeChatPay 3 | ========= 4 | 5 | .. py:class:: WeChatPay(appid, mch_id, notify_url, pay_secret, cert=None, key=None) 6 | 7 | .. py:method:: unifiedorder(device_info, sign_type, fee_type, trade_type, **kwargs) 8 | 9 | Form a new order. more information at 10 | `API `_ 11 | 12 | :param device_info: exception type 13 | :param sign_type: sign method(MD5 or HMAC-SHA256) 14 | :param fee_type: currency type 15 | :param attach: attach data 16 | :param out_trade_no: order id (should be unique in your system) 17 | :param trade_type: `(JSAPI,NATIVE,APP) `_ 18 | :param body: order description 19 | :param detail: item detail 20 | :param total_fee: the amount of fee 21 | :param spbill_create_ip: client ip address 22 | :param time_start: order generate time (format yyyyMMddHHmmss) 23 | :param time_expire: order expire time (format yyyyMMddHHmmss) 24 | :param goods_tag: `discount info `_ 25 | :param product_id: item id 26 | :param limit_pay: no_credit 27 | :param openid: user wechat openid 28 | :param scene_info: scenario info 29 | :rtype: :py:class:`UnifiedorderResult` 30 | 31 | .. py:method:: random_str() 32 | 33 | Generate a random string 34 | 35 | :rtype: string 36 | 37 | .. py:method:: verify_notify(req) 38 | 39 | Verify WeChat payment notification 40 | 41 | :param req: Request object from requests 42 | :rtype: :py:class:`NotifyResult` or :py:class:`ErrorResult` 43 | 44 | .. py:method:: to_xml(dct) 45 | 46 | Transfer a dict to xml string 47 | :param dct: data dict to send 48 | :rtype: string 49 | 50 | .. py:method:: sendbox_sign() 51 | 52 | Generate sendbox secret key 53 | `API `_ 54 | 55 | :rtype: :py:class:`SendBoxKey` 56 | 57 | 58 | .. py:method:: query_order(**kwargs) 59 | 60 | Query order from WeChat 61 | `API `_ 62 | 63 | :param transaction_id: wechat order id 64 | :param out_trade_no: order id (transaction_id and out_trade_no only need one) 65 | :rtype: :py:class:`OrderResult` 66 | 67 | .. py:method:: downloadbill(bill_date, sign_type='MD5', bill_type='ALL', tar_type='GZIP') 68 | 69 | Download bills 70 | `API `_ 71 | 72 | :param bill_date: the date of bill (format yyyymmdd) 73 | :param bill_type: the type of bill (ALL, SUCCESS, REFUND, RECHARGE_REFUND) 74 | :param tar_type: tar type(GZIP) 75 | :rtype: :py:class:`DownLoadBillResult` 76 | 77 | .. py:method:: close_order(out_trade_no, sign_type='MD5') 78 | 79 | Close order 80 | `API `_ 81 | 82 | :param out_trade_no: order id 83 | :rtype: :py:class:`CloseOrderResult` 84 | 85 | .. py:method:: short_url(long_url, sign_type='MD5') 86 | 87 | Convert long url to short url and make the Qr code more recognizable 88 | `API `_ 89 | 90 | :param long_url: long url 91 | :rtype: :py:class:`ShortUrlResult` 92 | 93 | .. py:method:: refund(out_trade_no, out_refund_no, total_fee, refund_fee, sign_type='MD5', refund_fee_type='CNY', **kwargs) 94 | 95 | Method for refund 96 | **this method need you to proide your cert.pem and key.pem file** 97 | `API `_ 98 | 99 | :param transaction_id: wechat order id 100 | :param out_trade_no: order id (transaction_id and out_trade_no only need one) 101 | :param out_refund_no: refund id 102 | :param total_fee: total order fee 103 | :param refund_fee: refund total fee 104 | :param refund_fee_type: currency type (CNY) 105 | :param refund_desc: refund reason 106 | :param refund_account: refund account 107 | :rtype: :py:class::`RefundResult` 108 | 109 | .. py:method:: refund_query(out_refund_no, sign_type='MD5', **kwargs) 110 | 111 | Query refund process 112 | `API `_ 113 | :param transaction_id: wechat order id 114 | :param out_trade_no: order id 115 | :param out_refund_no: refund id 116 | :param refund_id: refund id from WeChat (transaction_id, out_trade_no, out_refund_no, refund_id only need to one) 117 | :param offset: query offset 118 | :rtype: :py:class::`RefundQueryResult` 119 | -------------------------------------------------------------------------------- /doc/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # wechat-pay-sdk documentation build configuration file, created by 4 | # sphinx-quickstart on Tue Dec 19 18:32:24 2017. 5 | # 6 | # This file is execfile()d with the current directory set to its 7 | # containing dir. 8 | # 9 | # Note that not all possible configuration values are present in this 10 | # autogenerated file. 11 | # 12 | # All configuration values have a default; values that are commented out 13 | # serve to show the default. 14 | 15 | # If extensions (or modules to document with autodoc) are in another directory, 16 | # add these directories to sys.path here. If the directory is relative to the 17 | # documentation root, use os.path.abspath to make it absolute, like shown here. 18 | # 19 | # import os 20 | # import sys 21 | # sys.path.insert(0, os.path.abspath('.')) 22 | 23 | 24 | # -- General configuration ------------------------------------------------ 25 | 26 | # If your documentation needs a minimal Sphinx version, state it here. 27 | # 28 | # needs_sphinx = '1.0' 29 | 30 | # Add any Sphinx extension module names here, as strings. They can be 31 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 32 | # ones. 33 | extensions = [] 34 | 35 | # Add any paths that contain templates here, relative to this directory. 36 | templates_path = ['_templates'] 37 | 38 | # The suffix(es) of source filenames. 39 | # You can specify multiple suffix as a list of string: 40 | # 41 | # source_suffix = ['.rst', '.md'] 42 | source_suffix = '.rst' 43 | 44 | # The master toctree document. 45 | master_doc = 'index' 46 | 47 | # General information about the project. 48 | project = u'wechat-pay-sdk' 49 | copyright = u'2017, Zack Ren' 50 | author = u'Zack Ren' 51 | 52 | # The version info for the project you're documenting, acts as replacement for 53 | # |version| and |release|, also used in various other places throughout the 54 | # built documents. 55 | # 56 | # The short X.Y version. 57 | version = u'0.4' 58 | # The full version, including alpha/beta/rc tags. 59 | release = u'0.4' 60 | 61 | # The language for content autogenerated by Sphinx. Refer to documentation 62 | # for a list of supported languages. 63 | # 64 | # This is also used if you do content translation via gettext catalogs. 65 | # Usually you set "language" from the command line for these cases. 66 | language = None 67 | 68 | # List of patterns, relative to source directory, that match files and 69 | # directories to ignore when looking for source files. 70 | # This patterns also effect to html_static_path and html_extra_path 71 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 72 | 73 | # The name of the Pygments (syntax highlighting) style to use. 74 | pygments_style = 'sphinx' 75 | 76 | # If true, `todo` and `todoList` produce output, else they produce nothing. 77 | todo_include_todos = False 78 | 79 | # -- Options for HTML output ---------------------------------------------- 80 | 81 | # The theme to use for HTML and HTML Help pages. See the documentation for 82 | # a list of builtin themes. 83 | # 84 | html_theme = 'alabaster' 85 | 86 | # Theme options are theme-specific and customize the look and feel of a theme 87 | # further. For a list of options available for each theme, see the 88 | # documentation. 89 | # 90 | # html_theme_options = {} 91 | 92 | # Add any paths that contain custom static files (such as style sheets) here, 93 | # relative to this directory. They are copied after the builtin static files, 94 | # so a file named "default.css" will overwrite the builtin "default.css". 95 | html_static_path = ['_static'] 96 | 97 | # Custom sidebar templates, must be a dictionary that maps document names 98 | # to template names. 99 | # 100 | # This is required for the alabaster theme 101 | # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars 102 | show_related = True 103 | html_sidebars = { 104 | '**': [ 105 | 'author.html', 106 | 'relations.html', # needs 'show_related': True theme option to display 107 | 'searchbox.html', 108 | 'localtoc.html', 109 | 'globaltoc.html', 110 | ] 111 | } 112 | 113 | # -- Options for HTMLHelp output ------------------------------------------ 114 | 115 | # Output file base name for HTML help builder. 116 | htmlhelp_basename = 'wechat-pay-sdkdoc' 117 | 118 | # -- Options for LaTeX output --------------------------------------------- 119 | 120 | latex_elements = { 121 | # The paper size ('letterpaper' or 'a4paper'). 122 | # 123 | # 'papersize': 'letterpaper', 124 | 125 | # The font size ('10pt', '11pt' or '12pt'). 126 | # 127 | # 'pointsize': '10pt', 128 | 129 | # Additional stuff for the LaTeX preamble. 130 | # 131 | # 'preamble': '', 132 | 133 | # Latex figure (float) alignment 134 | # 135 | # 'figure_align': 'htbp', 136 | } 137 | 138 | # Grouping the document tree into LaTeX files. List of tuples 139 | # (source start file, target name, title, 140 | # author, documentclass [howto, manual, or own class]). 141 | latex_documents = [ 142 | (master_doc, 'wechat-pay-sdk.tex', u'wechat-pay-sdk Documentation', 143 | u'Zack Ren', 'manual'), 144 | ] 145 | 146 | # -- Options for manual page output --------------------------------------- 147 | 148 | # One entry per manual page. List of tuples 149 | # (source start file, name, description, authors, manual section). 150 | man_pages = [ 151 | (master_doc, 'wechat-pay-sdk', u'wechat-pay-sdk Documentation', 152 | [author], 1) 153 | ] 154 | 155 | # -- Options for Texinfo output ------------------------------------------- 156 | 157 | # Grouping the document tree into Texinfo files. List of tuples 158 | # (source start file, target name, title, author, 159 | # dir menu entry, description, category) 160 | texinfo_documents = [ 161 | (master_doc, 'wechat-pay-sdk', u'wechat-pay-sdk Documentation', 162 | author, 'wechat-pay-sdk', 'One line description of project.', 163 | 'Miscellaneous'), 164 | ] 165 | -------------------------------------------------------------------------------- /wechatpay/models.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import xmltodict 3 | from requests import Response 4 | 5 | 6 | class WeChatResult(object): 7 | def __init__(self, resp): 8 | # Response object 9 | self.resp = resp 10 | 11 | # 本次逻辑处理最终结果 12 | self.success = False 13 | 14 | # 结果字典 15 | self.result = self._parse_xml(resp) 16 | 17 | if self.result.get('return_code') == 'SUCCESS': 18 | self.success = True 19 | else: 20 | self.error_msg = {'return_msg': self.result.get('return_msg'), 21 | 'err_code': self.result.get('err_code', ''), 22 | 'err_code_des': self.result.get('err_code_des', '')} 23 | 24 | @staticmethod 25 | def _parse_xml(resp): 26 | if isinstance(resp, Response): 27 | # parse response 28 | return xmltodict.parse(resp.content).get('xml', None) 29 | else: 30 | # parse request 31 | return xmltodict.parse(resp.data).get('xml', None) 32 | 33 | 34 | class UnifiedorderResult(WeChatResult): 35 | def __init__(self, resp): 36 | super(UnifiedorderResult, self).__init__(resp) 37 | 38 | if self.success and self.result.get('result_code', '') == 'SUCCESS': 39 | # 交易类型 40 | self.trade_type = self.result.get('trade_type') 41 | # 预支付交易会话标识 42 | self.prepay_id = self.result.get('prepay_id') 43 | # 二维码链接(trade_type为NATIVE时有返回) 44 | self.code_url = self.result.get('code_url', '') 45 | else: 46 | self.success = False 47 | self.error_msg = {'return_msg': self.result.get('return_msg'), 48 | 'err_code': self.result.get('err_code', ''), 49 | 'err_code_des': self.result.get('err_code_des', '')} 50 | 51 | 52 | class SendBoxKey(WeChatResult): 53 | def __init__(self, resp): 54 | super(SendBoxKey, self).__init__(resp) 55 | 56 | self.key = self.result.get('sandbox_signkey', '') 57 | 58 | 59 | class NotifyResult(WeChatResult): 60 | def __init__(self, resp): 61 | super(NotifyResult, self).__init__(resp) 62 | 63 | if self.success and self.result.get('result_code', '') == 'SUCCESS': 64 | for key in self.result.keys(): 65 | setattr(self, key, self.result.get(key)) 66 | else: 67 | self.success = False 68 | self.error_msg = {'return_msg': self.result.get('return_msg'), 69 | 'err_code': self.result.get('err_code', ''), 70 | 'err_code_des': self.result.get('err_code_des', '')} 71 | 72 | 73 | class OrderResult(WeChatResult): 74 | def __init__(self, resp): 75 | super(OrderResult, self).__init__(resp) 76 | 77 | if self.success and self.result.get('result_code', '') == 'SUCCESS': 78 | self.trade_state = self.result.get('trade_state') 79 | self.out_trade_no = self.result.get('out_trade_no') 80 | if self.trade_state == 'SUCCESS': 81 | # 支付成功 82 | self.total_fee = self.result.get('total_fee') 83 | else: 84 | self.success = False 85 | self.error_msg = {'return_msg': self.result.get('return_msg'), 86 | 'err_code': self.result.get('err_code', ''), 87 | 'err_code_des': self.result.get('err_code_des', '')} 88 | 89 | 90 | class ErrorResult(WeChatResult): 91 | def __init__(self, resp): 92 | super(ErrorResult, self).__init__(resp) 93 | self.success = False 94 | self.error_msg = {'return_msg': self.result.get('return_msg'), 95 | 'err_code': self.result.get('err_code', ''), 96 | 'err_code_des': self.result.get('err_code_des', '')} 97 | 98 | 99 | class DownLoadBillResult(object): 100 | def __init__(self, resp): 101 | self.text = resp.text 102 | self.content = resp.content 103 | 104 | 105 | class CloseOrderResult(WeChatResult): 106 | def __init__(self, resp): 107 | super(CloseOrderResult, self).__init__(resp) 108 | if self.success and self.result.get('result_code', '') == 'SUCCESS': 109 | self.success = True 110 | 111 | 112 | class ShortUrlResult(WeChatResult): 113 | def __init__(self, resp): 114 | super(ShortUrlResult, self).__init__(resp) 115 | if self.success and self.result.get('result_code', '') == 'SUCCESS': 116 | self.short_url = self.result.get('short_url') 117 | 118 | 119 | class RefundResult(WeChatResult): 120 | def __init__(self, resp): 121 | super(RefundResult, self).__init__(resp) 122 | if self.success and self.result.get('result_code', '') == 'SUCCESS': 123 | for key in self.result.keys(): 124 | setattr(self, key, self.result.get(key)) 125 | else: 126 | self.success = False 127 | self.error_msg = {'return_msg': self.result.get('return_msg'), 128 | 'err_code': self.result.get('err_code', ''), 129 | 'err_code_des': self.result.get('err_code_des', '')} 130 | 131 | 132 | class RefundQueryResult(WeChatResult): 133 | def __init__(self, resp): 134 | super(RefundQueryResult, self).__init__(resp) 135 | if self.success and self.result.get('result_code', '') == 'SUCCESS': 136 | pass 137 | else: 138 | self.success = False 139 | self.error_msg = {'return_msg': self.result.get('return_msg'), 140 | 'err_code': self.result.get('err_code', ''), 141 | 'err_code_des': self.result.get('err_code_des', '')} 142 | 143 | 144 | WECHAT_CLASS = { 145 | 'unifiedorder': UnifiedorderResult, 146 | 'getsignkey': SendBoxKey, 147 | 'notify_result': NotifyResult, 148 | 'orderquery': OrderResult, 149 | 'error': ErrorResult, 150 | 'downloadbill': DownLoadBillResult, 151 | 'closeorder': CloseOrderResult, 152 | 'shorturl': ShortUrlResult, 153 | 'refund': RefundResult, 154 | 'refundquery': RefundQueryResult 155 | } 156 | -------------------------------------------------------------------------------- /wechatpay/__init__.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | from uuid import uuid4 3 | import hashlib 4 | import dicttoxml 5 | import xmltodict 6 | import requests 7 | from collections import OrderedDict 8 | from .models import WECHAT_CLASS 9 | 10 | 11 | class WeChatPay(object): 12 | """ 13 | documentation 14 | https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 15 | appid: 公众号id 16 | mch_id: 商户id 17 | notify_url: 通知URL 18 | pay_secret: 秘钥 19 | cert: path to your apiclient_cert.pem (download from wechat website) 20 | key: path to your apiclient_key.pem (download from wechat website) 21 | """ 22 | 23 | def __init__(self, appid, mch_id, notify_url, pay_secret, cert=None, key=None): 24 | self.appid = appid 25 | self.mch_id = mch_id 26 | self.mch_base = 'https://api.mch.weixin.qq.com/' 27 | self.notify_url = notify_url 28 | self.pay_secret = pay_secret 29 | self.cert = cert 30 | self.key = key 31 | 32 | @staticmethod 33 | def random_str(): 34 | """ 35 | :return: 随机字符串 36 | """ 37 | return str(uuid4()).replace('-', '') 38 | 39 | def _gen_sign(self, dct): 40 | """ 41 | :param dct: 所需发送的所有数据的字典集合 42 | 详情:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3 43 | :return: 签名 44 | """ 45 | params = OrderedDict(sorted(dct.items(), key=lambda t: t[0])) 46 | stringA = '' 47 | for key, value in params.items(): 48 | stringA += str(key) + '=' + str(value) + '&' 49 | stringSignTemp = stringA + 'key=' + self.pay_secret 50 | # stringSignTemp = stringA + 'key=7b3515d618d2f0ae70f6ac453983ea7e' # send box 51 | return hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper() 52 | 53 | def _verify_sign(self, dct): 54 | sign = dct.pop('sign') 55 | if sign == self._gen_sign(dct): 56 | return True 57 | else: 58 | return False 59 | 60 | def unifiedorder(self, device_info='WEB', sign_type='MD5', fee_type='CNY', trade_type='NATIVE', **kwargs): 61 | """ 62 | 统一下单 所需的数据集合 63 | https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 64 | :param device_info: 设备号 65 | :param sign_type: 签名类型 66 | :param fee_type: 标价币种 67 | :param trade_type: 交易类型 68 | :param kwargs: 其他数据 69 | :return: 所需要发送数据的xml格式字符串 70 | """ 71 | data = { 72 | 'appid': self.appid, 73 | 'mch_id': self.mch_id, 74 | 'device_info': device_info, 75 | 'sign_type': sign_type, 76 | 'fee_type': fee_type, 77 | 'trade_type': trade_type, 78 | 'nonce_str': self.random_str(), 79 | 'notify_url': self.notify_url 80 | } 81 | data.update(kwargs) 82 | data.update({ 83 | 'sign': self._gen_sign(data) 84 | }) 85 | return self._request_post(self.mch_base + 'pay/unifiedorder', self.to_xml(data)) 86 | 87 | def verify_notify(self, req): 88 | """ 89 | :param req: wechat post request notify 90 | :return: NotifyResult instance 91 | """ 92 | result = xmltodict.parse(req.data).get('xml') 93 | if self._verify_sign(result): 94 | return WECHAT_CLASS['notify_result'](req) 95 | else: 96 | return WECHAT_CLASS['error'](req) 97 | 98 | @staticmethod 99 | def to_xml(dct): 100 | """ 101 | 字典转换 xml 102 | :param dct: 字典 103 | :return: xml 字符串 104 | """ 105 | return dicttoxml.dicttoxml(dct, custom_root='xml', attr_type=False, cdata=True) 106 | 107 | @staticmethod 108 | def _parse_result(resp, class_key): 109 | return WECHAT_CLASS[class_key](resp) 110 | 111 | def _request_post(self, url, data, is_cert=False): 112 | headers = {'Content-Type': 'application/xml'} 113 | if is_cert: 114 | if not self.cert or not self.key: 115 | raise ValueError 116 | resp = requests.post(url, data=data, headers=headers, cert=(self.cert, self.key)) 117 | else: 118 | resp = requests.post(url, data=data, headers=headers) 119 | return self._parse_result(resp, url.split('/')[-1]) 120 | 121 | def sendbox_sign(self): 122 | data = { 123 | 'mch_id': self.mch_id, 124 | 'nonce_str': self.random_str(), 125 | } 126 | data.update({ 127 | 'sign': self._gen_sign(data) 128 | }) 129 | return self._request_post(self.mch_base + 'pay/getsignkey', self.to_xml(data)) 130 | 131 | def query_order(self, **kwargs): 132 | """ 133 | :param kwargs: out_trade_no 订单号 134 | :return: 135 | """ 136 | data = { 137 | 'appid': self.appid, 138 | 'mch_id': self.mch_id, 139 | 'nonce_str': self.random_str(), 140 | 'sign_type': 'MD5' 141 | } 142 | data.update(kwargs) 143 | data.update({ 144 | 'sign': self._gen_sign(data) 145 | }) 146 | return self._request_post(self.mch_base + 'pay/orderquery', self.to_xml(data)) 147 | 148 | def downloadbill(self, bill_date, sign_type='MD5', bill_type='ALL', tar_type='GZIP'): 149 | ''' 150 | 下载对账单 151 | https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_6 152 | :param bill_date: 账单日期 153 | :param sign_type: 加密方式 154 | :param bill_type: 账单类型 155 | :param tar_type: 压缩账单 156 | :return: 157 | ''' 158 | data = { 159 | 'appid': self.appid, 160 | 'mch_id': self.mch_id, 161 | 'sign_type': sign_type, 162 | 'nonce_str': self.random_str(), 163 | 'bill_date': bill_date, 164 | 'bill_type': bill_type, 165 | 'tar_type': tar_type 166 | } 167 | data.update({ 168 | 'sign': self._gen_sign(data) 169 | }) 170 | return self._request_post(self.mch_base + 'pay/downloadbill', self.to_xml(data)) 171 | 172 | def close_order(self, out_trade_no, sign_type='MD5'): 173 | ''' 174 | :param out_trade_no: 订单号 175 | :param sign_type: 加密类型 176 | :return: 177 | ''' 178 | data = { 179 | 'appid': self.appid, 180 | 'mch_id': self.mch_id, 181 | 'nonce_str': self.random_str(), 182 | 'out_trade_no': out_trade_no, 183 | 'sign_type': sign_type 184 | } 185 | data.update({ 186 | 'sign': self._gen_sign(data) 187 | }) 188 | return self._request_post(self.mch_base + 'pay/closeorder', self.to_xml(data)) 189 | 190 | def short_url(self, long_url, sign_type='MD5'): 191 | ''' 192 | :param long_url: 长连接 193 | :param sign_type: 加密类型 194 | :return: 195 | ''' 196 | data = { 197 | 'appid': self.appid, 198 | 'mch_id': self.mch_id, 199 | 'nonce_str': self.random_str(), 200 | 'sign_type': sign_type, 201 | 'long_url': long_url 202 | } 203 | data.update({ 204 | 'sign': self._gen_sign(data) 205 | }) 206 | return self._request_post(self.mch_base + 'tools/shorturl', self.to_xml(data)) 207 | 208 | def refund(self, out_trade_no, out_refund_no, total_fee, refund_fee, sign_type='MD5', refund_fee_type='CNY', **kwargs): 209 | ''' 210 | :param out_trade_no: 商户订单号 211 | :param out_refund_no: 商户退款单号 212 | :param total_fee: 订单总金额 213 | :param refund_fee: 退款总金额 214 | :param sign_type: 签名方法 215 | :param refund_fee_type: 退款币种 216 | :return: 217 | ''' 218 | data = { 219 | 'appid': self.appid, 220 | 'mch_id': self.mch_id, 221 | 'nonce_str': self.random_str(), 222 | 'sign_type': sign_type, 223 | 'out_trade_no': out_trade_no, 224 | 'out_refund_no': out_refund_no, 225 | 'total_fee': total_fee, 226 | 'refund_fee': refund_fee, 227 | 'refund_fee_type': refund_fee_type 228 | } 229 | data.update(kwargs) 230 | data.update({ 231 | 'sign': self._gen_sign(data) 232 | }) 233 | return self._request_post(self.mch_base + 'secapi/pay/refund', self.to_xml(data), is_cert=True) 234 | 235 | def refund_query(self, out_refund_no, sign_type='MD5', **kwargs): 236 | ''' 237 | :param out_refund_no: 商户退款单号 238 | :param sign_type: 签名方法 239 | :return: 240 | ''' 241 | data = { 242 | 'appid': self.appid, 243 | 'mch_id': self.mch_id, 244 | 'nonce_str': self.random_str(), 245 | 'sign_type': sign_type, 246 | 'out_refund_no': out_refund_no, 247 | } 248 | data.update(kwargs) 249 | data.update({ 250 | 'sign': self._gen_sign(data) 251 | }) 252 | return self._request_post(self.mch_base + 'pay/refundquery', self.to_xml(data)) 253 | 254 | -------------------------------------------------------------------------------- /doc/_build/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | Welcome to wechat-pay-sdk’s documentation! — wechat-pay-sdk 0.4 documentation 9 | 10 | 11 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
39 |
40 |
41 | 42 |
43 |

Welcome to wechat-pay-sdk’s documentation!

44 |
45 |

wechat-pay-sdk is an unofficial sdk for WeChat pay. It contains almost all API of WeChat pay.

46 |

Code host at Github

47 |
48 |
49 |

Install WeChat-Pay-SDK

50 |
51 |

Install with pip:

52 |
53 |
pip install wechat-pay-sdk
54 |

Or

55 |

Install from source

56 |
57 |
python setup.py install
58 |
59 |
60 |
61 |

How To Use

62 |
63 |

Import the WeChatPay class and init it with your own parameters:

64 |
from wechatpay import WeChatPay
 65 | 
 66 | WECHAT_APPID = 'your_app_id'
 67 | WECHAT_MCH_ID = 'your_mch_id'
 68 | WECHAT_NOTIFY_URL = 'your_notify_url'
 69 | WECHAT_PAY_SECRET = 'your_pay_secret'
 70 | WECHAT_CERT = 'path/to/your_cert.pem'
 71 | WECHAT_KEY = 'patch/to/your_key.pem'
 72 | 
 73 | 
 74 | sp = WeChatPay(WECHAT_APPID, WECHAT_MCH_ID,
 75 |                    WECHAT_NOTIFY_URL, WECHAT_PAY_SECRET, WECHAT_CERT, WECHAT_KEY)
 76 | 
 77 | # post order
 78 | result = sp.unifiedorder(body=body, out_trade_no=out_trade_no, total_fee=total_fee,
 79 |                              spbill_create_ip=client_ip)
 80 | 
 81 | # order query
 82 | result = sp.query_order(out_trade_no=out_trade_no)
 83 | 
 84 | 
 85 | # download bills
 86 | result = sp.downloadbill(bill_date=bill_date, bill_type=bill_type)
 87 | 
 88 | # refund (this method need your cert.pem and key.pem file which need you to download from the official website)
 89 | result = sp.refund(out_trade_no, out_refund_no, total_fee, total_fee)
 90 | 
 91 | # refund query
 92 | result = sp.refund_query(out_trade_no)
 93 | 
 94 | if result.success:
 95 |     # your code
 96 |     pass
 97 | 
98 |
99 |
100 |
101 |
102 |

API

103 |
104 | 108 |
109 |
110 |
111 |

Indices and tables

112 | 116 |
117 |
118 | 119 | 120 |
121 |
122 |
123 | 174 |
175 |
176 | 187 | 188 | 189 | 190 | 191 | 192 | -------------------------------------------------------------------------------- /doc/_build/html/_static/doctools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * doctools.js 3 | * ~~~~~~~~~~~ 4 | * 5 | * Sphinx JavaScript utilities for all documentation. 6 | * 7 | * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | /** 13 | * select a different prefix for underscore 14 | */ 15 | $u = _.noConflict(); 16 | 17 | /** 18 | * make the code below compatible with browsers without 19 | * an installed firebug like debugger 20 | if (!window.console || !console.firebug) { 21 | var names = ["log", "debug", "info", "warn", "error", "assert", "dir", 22 | "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", 23 | "profile", "profileEnd"]; 24 | window.console = {}; 25 | for (var i = 0; i < names.length; ++i) 26 | window.console[names[i]] = function() {}; 27 | } 28 | */ 29 | 30 | /** 31 | * small helper function to urldecode strings 32 | */ 33 | jQuery.urldecode = function(x) { 34 | return decodeURIComponent(x).replace(/\+/g, ' '); 35 | }; 36 | 37 | /** 38 | * small helper function to urlencode strings 39 | */ 40 | jQuery.urlencode = encodeURIComponent; 41 | 42 | /** 43 | * This function returns the parsed url parameters of the 44 | * current request. Multiple values per key are supported, 45 | * it will always return arrays of strings for the value parts. 46 | */ 47 | jQuery.getQueryParameters = function(s) { 48 | if (typeof s === 'undefined') 49 | s = document.location.search; 50 | var parts = s.substr(s.indexOf('?') + 1).split('&'); 51 | var result = {}; 52 | for (var i = 0; i < parts.length; i++) { 53 | var tmp = parts[i].split('=', 2); 54 | var key = jQuery.urldecode(tmp[0]); 55 | var value = jQuery.urldecode(tmp[1]); 56 | if (key in result) 57 | result[key].push(value); 58 | else 59 | result[key] = [value]; 60 | } 61 | return result; 62 | }; 63 | 64 | /** 65 | * highlight a given string on a jquery object by wrapping it in 66 | * span elements with the given class name. 67 | */ 68 | jQuery.fn.highlightText = function(text, className) { 69 | function highlight(node, addItems) { 70 | if (node.nodeType === 3) { 71 | var val = node.nodeValue; 72 | var pos = val.toLowerCase().indexOf(text); 73 | if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { 74 | var span; 75 | var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); 76 | if (isInSVG) { 77 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 78 | } else { 79 | span = document.createElement("span"); 80 | span.className = className; 81 | } 82 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 83 | node.parentNode.insertBefore(span, node.parentNode.insertBefore( 84 | document.createTextNode(val.substr(pos + text.length)), 85 | node.nextSibling)); 86 | node.nodeValue = val.substr(0, pos); 87 | if (isInSVG) { 88 | var bbox = span.getBBox(); 89 | var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); 90 | rect.x.baseVal.value = bbox.x; 91 | rect.y.baseVal.value = bbox.y; 92 | rect.width.baseVal.value = bbox.width; 93 | rect.height.baseVal.value = bbox.height; 94 | rect.setAttribute('class', className); 95 | var parentOfText = node.parentNode.parentNode; 96 | addItems.push({ 97 | "parent": node.parentNode, 98 | "target": rect}); 99 | } 100 | } 101 | } 102 | else if (!jQuery(node).is("button, select, textarea")) { 103 | jQuery.each(node.childNodes, function() { 104 | highlight(this, addItems); 105 | }); 106 | } 107 | } 108 | var addItems = []; 109 | var result = this.each(function() { 110 | highlight(this, addItems); 111 | }); 112 | for (var i = 0; i < addItems.length; ++i) { 113 | jQuery(addItems[i].parent).before(addItems[i].target); 114 | } 115 | return result; 116 | }; 117 | 118 | /* 119 | * backward compatibility for jQuery.browser 120 | * This will be supported until firefox bug is fixed. 121 | */ 122 | if (!jQuery.browser) { 123 | jQuery.uaMatch = function(ua) { 124 | ua = ua.toLowerCase(); 125 | 126 | var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || 127 | /(webkit)[ \/]([\w.]+)/.exec(ua) || 128 | /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || 129 | /(msie) ([\w.]+)/.exec(ua) || 130 | ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || 131 | []; 132 | 133 | return { 134 | browser: match[ 1 ] || "", 135 | version: match[ 2 ] || "0" 136 | }; 137 | }; 138 | jQuery.browser = {}; 139 | jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; 140 | } 141 | 142 | /** 143 | * Small JavaScript module for the documentation. 144 | */ 145 | var Documentation = { 146 | 147 | init : function() { 148 | this.fixFirefoxAnchorBug(); 149 | this.highlightSearchWords(); 150 | this.initIndexTable(); 151 | 152 | }, 153 | 154 | /** 155 | * i18n support 156 | */ 157 | TRANSLATIONS : {}, 158 | PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, 159 | LOCALE : 'unknown', 160 | 161 | // gettext and ngettext don't access this so that the functions 162 | // can safely bound to a different name (_ = Documentation.gettext) 163 | gettext : function(string) { 164 | var translated = Documentation.TRANSLATIONS[string]; 165 | if (typeof translated === 'undefined') 166 | return string; 167 | return (typeof translated === 'string') ? translated : translated[0]; 168 | }, 169 | 170 | ngettext : function(singular, plural, n) { 171 | var translated = Documentation.TRANSLATIONS[singular]; 172 | if (typeof translated === 'undefined') 173 | return (n == 1) ? singular : plural; 174 | return translated[Documentation.PLURALEXPR(n)]; 175 | }, 176 | 177 | addTranslations : function(catalog) { 178 | for (var key in catalog.messages) 179 | this.TRANSLATIONS[key] = catalog.messages[key]; 180 | this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); 181 | this.LOCALE = catalog.locale; 182 | }, 183 | 184 | /** 185 | * add context elements like header anchor links 186 | */ 187 | addContextElements : function() { 188 | $('div[id] > :header:first').each(function() { 189 | $('\u00B6'). 190 | attr('href', '#' + this.id). 191 | attr('title', _('Permalink to this headline')). 192 | appendTo(this); 193 | }); 194 | $('dt[id]').each(function() { 195 | $('\u00B6'). 196 | attr('href', '#' + this.id). 197 | attr('title', _('Permalink to this definition')). 198 | appendTo(this); 199 | }); 200 | }, 201 | 202 | /** 203 | * workaround a firefox stupidity 204 | * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 205 | */ 206 | fixFirefoxAnchorBug : function() { 207 | if (document.location.hash) 208 | window.setTimeout(function() { 209 | document.location.href += ''; 210 | }, 10); 211 | }, 212 | 213 | /** 214 | * highlight the search words provided in the url in the text 215 | */ 216 | highlightSearchWords : function() { 217 | var params = $.getQueryParameters(); 218 | var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; 219 | if (terms.length) { 220 | var body = $('div.body'); 221 | if (!body.length) { 222 | body = $('body'); 223 | } 224 | window.setTimeout(function() { 225 | $.each(terms, function() { 226 | body.highlightText(this.toLowerCase(), 'highlighted'); 227 | }); 228 | }, 10); 229 | $('') 231 | .appendTo($('#searchbox')); 232 | } 233 | }, 234 | 235 | /** 236 | * init the domain index toggle buttons 237 | */ 238 | initIndexTable : function() { 239 | var togglers = $('img.toggler').click(function() { 240 | var src = $(this).attr('src'); 241 | var idnum = $(this).attr('id').substr(7); 242 | $('tr.cg-' + idnum).toggle(); 243 | if (src.substr(-9) === 'minus.png') 244 | $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); 245 | else 246 | $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); 247 | }).css('display', ''); 248 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { 249 | togglers.click(); 250 | } 251 | }, 252 | 253 | /** 254 | * helper function to hide the search marks again 255 | */ 256 | hideSearchWords : function() { 257 | $('#searchbox .highlight-link').fadeOut(300); 258 | $('span.highlighted').removeClass('highlighted'); 259 | }, 260 | 261 | /** 262 | * make the url absolute 263 | */ 264 | makeURL : function(relativeURL) { 265 | return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; 266 | }, 267 | 268 | /** 269 | * get the current relative url 270 | */ 271 | getCurrentURL : function() { 272 | var path = document.location.pathname; 273 | var parts = path.split(/\//); 274 | $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { 275 | if (this === '..') 276 | parts.pop(); 277 | }); 278 | var url = parts.join('/'); 279 | return path.substring(url.lastIndexOf('/') + 1, path.length - 1); 280 | }, 281 | 282 | initOnKeyListeners: function() { 283 | $(document).keyup(function(event) { 284 | var activeElementType = document.activeElement.tagName; 285 | // don't navigate when in search box or textarea 286 | if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { 287 | switch (event.keyCode) { 288 | case 37: // left 289 | var prevHref = $('link[rel="prev"]').prop('href'); 290 | if (prevHref) { 291 | window.location.href = prevHref; 292 | return false; 293 | } 294 | case 39: // right 295 | var nextHref = $('link[rel="next"]').prop('href'); 296 | if (nextHref) { 297 | window.location.href = nextHref; 298 | return false; 299 | } 300 | } 301 | } 302 | }); 303 | } 304 | }; 305 | 306 | // quick alias for translations 307 | _ = Documentation.gettext; 308 | 309 | $(document).ready(function() { 310 | Documentation.init(); 311 | }); -------------------------------------------------------------------------------- /doc/_build/html/genindex.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | Index — wechat-pay-sdk 0.4 documentation 10 | 11 | 12 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
39 |
40 |
41 | 42 | 43 |

Index

44 | 45 |
46 | C 47 | | D 48 | | E 49 | | K 50 | | N 51 | | O 52 | | P 53 | | Q 54 | | R 55 | | S 56 | | T 57 | | U 58 | | V 59 | | W 60 | 61 |
62 |

C

63 | 64 | 70 | 76 |
77 | 78 |

D

79 | 80 | 84 | 88 |
89 | 90 |

E

91 | 92 | 100 | 104 |
105 | 106 |

K

107 | 108 | 112 |
113 | 114 |

N

115 | 116 | 120 |
121 | 122 |

O

123 | 124 | 128 | 132 |
133 | 134 |

P

135 | 136 | 140 |
141 | 142 |

Q

143 | 144 | 148 |
149 | 150 |

R

151 | 152 | 160 | 170 |
171 | 172 |

S

173 | 174 | 182 | 194 |
195 | 196 |

T

197 | 198 | 204 | 212 |
213 | 214 |

U

215 | 216 | 220 | 224 |
225 | 226 |

V

227 | 228 | 232 |
233 | 234 |

W

235 | 236 | 240 | 244 |
245 | 246 | 247 | 248 |
249 |
250 |
251 | 290 |
291 |
292 | 300 | 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /doc/_build/html/_static/underscore.js: -------------------------------------------------------------------------------- 1 | // Underscore.js 1.3.1 2 | // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. 3 | // Underscore is freely distributable under the MIT license. 4 | // Portions of Underscore are inspired or borrowed from Prototype, 5 | // Oliver Steele's Functional, and John Resig's Micro-Templating. 6 | // For all details and documentation: 7 | // http://documentcloud.github.com/underscore 8 | (function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== 9 | c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, 10 | h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= 11 | b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a== 12 | null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= 13 | function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= 14 | e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= 15 | function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, 17 | c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}}; 24 | b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, 25 | 1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; 26 | b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; 27 | b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), 28 | function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ 29 | u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= 30 | function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= 31 | true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); 32 | -------------------------------------------------------------------------------- /doc/_build/html/WeChatResult.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | WeChatResult — wechat-pay-sdk 0.4 documentation 9 | 10 | 11 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
39 |
40 |
41 | 42 |
43 |

WeChatResult

44 |
45 |
46 | class WeChatResult(resp)
47 |
48 |
49 | resp
50 |

resp is the instance of Response class from requests

51 |
52 | 53 |
54 |
55 | success
56 |

success is used to determine whether this request is successful

57 |
58 | 59 |
60 |
61 | result
62 |

result is a python dict which contains the response data that parsed from xml

63 |
64 | 65 |
66 |
67 | error_msg
68 |

error_msg contains the error message if anything went wrong

69 |
70 | 71 |
72 | 73 |
74 |
75 | class UnifiedorderResult(WeChatResult)
76 |
77 |
78 | trade_type
79 |

(JSAPI,NATIVE,APP)

80 |
81 | 82 |
83 |
84 | prepay_id
85 |

generate by WeChat for more operation (valid in 2 hours)

86 |
87 | 88 |
89 |
90 | code_url
91 |

Qr code url for payment

92 |
93 | 94 |
95 | 96 |
97 |
98 | class NotifyResult(WeChatResult)
99 |

Every key in result dict refer to a attribute of this class 100 | API

101 |
102 | 103 |
104 |
105 | class ErrorResult(WeChatResult)
106 |
107 |
108 | success
109 |

in this case success is False

110 |
111 | 112 |
113 |
114 | error_msg
115 |

error message dict

116 |
117 | 118 |
119 | 120 |
121 |
122 | class SendBoxKey(WeChatResult)
123 |
124 |
125 | key
126 |

send box secret key

127 |
128 | 129 |
130 | 131 |
132 |
133 | class OrderResult(WeChatResult)
134 |
135 |
136 | trade_state
137 |

the state of this order

138 |
139 | 140 |
141 |
142 | out_trade_no
143 |

order id

144 |
145 | 146 |
147 |
148 | total_fee
149 |

amount of fee of this order

150 |
151 | 152 |
153 | 154 |
155 |
156 | class DownLoadBillResult(WeChatResult)
157 |
158 |
159 | text
160 |

unicode of the bill content

161 |
162 | 163 |
164 |
165 | content
166 |

bill content

167 |
168 | 169 |
170 | 171 |
172 |
173 | class CloseOrderResult(WeChatResult)
174 |

pass

175 |
176 | 177 |
178 |
179 | class ShortUrlResult(WeChatResult)
180 |
181 |
182 | short_url
183 |

short url

184 |
185 | 186 |
187 | 188 |
189 |
190 | class RefundResult(WeChatResult)
191 |

Every key in result dict refer to a attribute of this class

192 |

API

193 |
194 | 195 |
196 |
197 | class RefundQueryResult(WeChatResult)
198 |

API

199 |

Because there are some field need to access by index, so use the result dict to fetch the data you need

200 |
201 | 202 |
203 | 204 | 205 |
206 |
207 |
208 | 248 |
249 |
250 | 261 | 262 | 263 | 264 | 265 | 266 | -------------------------------------------------------------------------------- /doc/_build/html/_static/basic.css: -------------------------------------------------------------------------------- 1 | /* 2 | * basic.css 3 | * ~~~~~~~~~ 4 | * 5 | * Sphinx stylesheet -- basic theme. 6 | * 7 | * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | /* -- main layout ----------------------------------------------------------- */ 13 | 14 | div.clearer { 15 | clear: both; 16 | } 17 | 18 | /* -- relbar ---------------------------------------------------------------- */ 19 | 20 | div.related { 21 | width: 100%; 22 | font-size: 90%; 23 | } 24 | 25 | div.related h3 { 26 | display: none; 27 | } 28 | 29 | div.related ul { 30 | margin: 0; 31 | padding: 0 0 0 10px; 32 | list-style: none; 33 | } 34 | 35 | div.related li { 36 | display: inline; 37 | } 38 | 39 | div.related li.right { 40 | float: right; 41 | margin-right: 5px; 42 | } 43 | 44 | /* -- sidebar --------------------------------------------------------------- */ 45 | 46 | div.sphinxsidebarwrapper { 47 | padding: 10px 5px 0 10px; 48 | } 49 | 50 | div.sphinxsidebar { 51 | float: left; 52 | width: 230px; 53 | margin-left: -100%; 54 | font-size: 90%; 55 | word-wrap: break-word; 56 | overflow-wrap : break-word; 57 | } 58 | 59 | div.sphinxsidebar ul { 60 | list-style: none; 61 | } 62 | 63 | div.sphinxsidebar ul ul, 64 | div.sphinxsidebar ul.want-points { 65 | margin-left: 20px; 66 | list-style: square; 67 | } 68 | 69 | div.sphinxsidebar ul ul { 70 | margin-top: 0; 71 | margin-bottom: 0; 72 | } 73 | 74 | div.sphinxsidebar form { 75 | margin-top: 10px; 76 | } 77 | 78 | div.sphinxsidebar input { 79 | border: 1px solid #98dbcc; 80 | font-family: sans-serif; 81 | font-size: 1em; 82 | } 83 | 84 | div.sphinxsidebar #searchbox input[type="text"] { 85 | width: 170px; 86 | } 87 | 88 | img { 89 | border: 0; 90 | max-width: 100%; 91 | } 92 | 93 | /* -- search page ----------------------------------------------------------- */ 94 | 95 | ul.search { 96 | margin: 10px 0 0 20px; 97 | padding: 0; 98 | } 99 | 100 | ul.search li { 101 | padding: 5px 0 5px 20px; 102 | background-image: url(file.png); 103 | background-repeat: no-repeat; 104 | background-position: 0 7px; 105 | } 106 | 107 | ul.search li a { 108 | font-weight: bold; 109 | } 110 | 111 | ul.search li div.context { 112 | color: #888; 113 | margin: 2px 0 0 30px; 114 | text-align: left; 115 | } 116 | 117 | ul.keywordmatches li.goodmatch a { 118 | font-weight: bold; 119 | } 120 | 121 | /* -- index page ------------------------------------------------------------ */ 122 | 123 | table.contentstable { 124 | width: 90%; 125 | margin-left: auto; 126 | margin-right: auto; 127 | } 128 | 129 | table.contentstable p.biglink { 130 | line-height: 150%; 131 | } 132 | 133 | a.biglink { 134 | font-size: 1.3em; 135 | } 136 | 137 | span.linkdescr { 138 | font-style: italic; 139 | padding-top: 5px; 140 | font-size: 90%; 141 | } 142 | 143 | /* -- general index --------------------------------------------------------- */ 144 | 145 | table.indextable { 146 | width: 100%; 147 | } 148 | 149 | table.indextable td { 150 | text-align: left; 151 | vertical-align: top; 152 | } 153 | 154 | table.indextable ul { 155 | margin-top: 0; 156 | margin-bottom: 0; 157 | list-style-type: none; 158 | } 159 | 160 | table.indextable > tbody > tr > td > ul { 161 | padding-left: 0em; 162 | } 163 | 164 | table.indextable tr.pcap { 165 | height: 10px; 166 | } 167 | 168 | table.indextable tr.cap { 169 | margin-top: 10px; 170 | background-color: #f2f2f2; 171 | } 172 | 173 | img.toggler { 174 | margin-right: 3px; 175 | margin-top: 3px; 176 | cursor: pointer; 177 | } 178 | 179 | div.modindex-jumpbox { 180 | border-top: 1px solid #ddd; 181 | border-bottom: 1px solid #ddd; 182 | margin: 1em 0 1em 0; 183 | padding: 0.4em; 184 | } 185 | 186 | div.genindex-jumpbox { 187 | border-top: 1px solid #ddd; 188 | border-bottom: 1px solid #ddd; 189 | margin: 1em 0 1em 0; 190 | padding: 0.4em; 191 | } 192 | 193 | /* -- domain module index --------------------------------------------------- */ 194 | 195 | table.modindextable td { 196 | padding: 2px; 197 | border-collapse: collapse; 198 | } 199 | 200 | /* -- general body styles --------------------------------------------------- */ 201 | 202 | div.body p, div.body dd, div.body li, div.body blockquote { 203 | -moz-hyphens: auto; 204 | -ms-hyphens: auto; 205 | -webkit-hyphens: auto; 206 | hyphens: auto; 207 | } 208 | 209 | a.headerlink { 210 | visibility: hidden; 211 | } 212 | 213 | h1:hover > a.headerlink, 214 | h2:hover > a.headerlink, 215 | h3:hover > a.headerlink, 216 | h4:hover > a.headerlink, 217 | h5:hover > a.headerlink, 218 | h6:hover > a.headerlink, 219 | dt:hover > a.headerlink, 220 | caption:hover > a.headerlink, 221 | p.caption:hover > a.headerlink, 222 | div.code-block-caption:hover > a.headerlink { 223 | visibility: visible; 224 | } 225 | 226 | div.body p.caption { 227 | text-align: inherit; 228 | } 229 | 230 | div.body td { 231 | text-align: left; 232 | } 233 | 234 | .first { 235 | margin-top: 0 !important; 236 | } 237 | 238 | p.rubric { 239 | margin-top: 30px; 240 | font-weight: bold; 241 | } 242 | 243 | img.align-left, .figure.align-left, object.align-left { 244 | clear: left; 245 | float: left; 246 | margin-right: 1em; 247 | } 248 | 249 | img.align-right, .figure.align-right, object.align-right { 250 | clear: right; 251 | float: right; 252 | margin-left: 1em; 253 | } 254 | 255 | img.align-center, .figure.align-center, object.align-center { 256 | display: block; 257 | margin-left: auto; 258 | margin-right: auto; 259 | } 260 | 261 | .align-left { 262 | text-align: left; 263 | } 264 | 265 | .align-center { 266 | text-align: center; 267 | } 268 | 269 | .align-right { 270 | text-align: right; 271 | } 272 | 273 | /* -- sidebars -------------------------------------------------------------- */ 274 | 275 | div.sidebar { 276 | margin: 0 0 0.5em 1em; 277 | border: 1px solid #ddb; 278 | padding: 7px 7px 0 7px; 279 | background-color: #ffe; 280 | width: 40%; 281 | float: right; 282 | } 283 | 284 | p.sidebar-title { 285 | font-weight: bold; 286 | } 287 | 288 | /* -- topics ---------------------------------------------------------------- */ 289 | 290 | div.topic { 291 | border: 1px solid #ccc; 292 | padding: 7px 7px 0 7px; 293 | margin: 10px 0 10px 0; 294 | } 295 | 296 | p.topic-title { 297 | font-size: 1.1em; 298 | font-weight: bold; 299 | margin-top: 10px; 300 | } 301 | 302 | /* -- admonitions ----------------------------------------------------------- */ 303 | 304 | div.admonition { 305 | margin-top: 10px; 306 | margin-bottom: 10px; 307 | padding: 7px; 308 | } 309 | 310 | div.admonition dt { 311 | font-weight: bold; 312 | } 313 | 314 | div.admonition dl { 315 | margin-bottom: 0; 316 | } 317 | 318 | p.admonition-title { 319 | margin: 0px 10px 5px 0px; 320 | font-weight: bold; 321 | } 322 | 323 | div.body p.centered { 324 | text-align: center; 325 | margin-top: 25px; 326 | } 327 | 328 | /* -- tables ---------------------------------------------------------------- */ 329 | 330 | table.docutils { 331 | border: 0; 332 | border-collapse: collapse; 333 | } 334 | 335 | table caption span.caption-number { 336 | font-style: italic; 337 | } 338 | 339 | table caption span.caption-text { 340 | } 341 | 342 | table.docutils td, table.docutils th { 343 | padding: 1px 8px 1px 5px; 344 | border-top: 0; 345 | border-left: 0; 346 | border-right: 0; 347 | border-bottom: 1px solid #aaa; 348 | } 349 | 350 | table.footnote td, table.footnote th { 351 | border: 0 !important; 352 | } 353 | 354 | th { 355 | text-align: left; 356 | padding-right: 5px; 357 | } 358 | 359 | table.citation { 360 | border-left: solid 1px gray; 361 | margin-left: 1px; 362 | } 363 | 364 | table.citation td { 365 | border-bottom: none; 366 | } 367 | 368 | /* -- figures --------------------------------------------------------------- */ 369 | 370 | div.figure { 371 | margin: 0.5em; 372 | padding: 0.5em; 373 | } 374 | 375 | div.figure p.caption { 376 | padding: 0.3em; 377 | } 378 | 379 | div.figure p.caption span.caption-number { 380 | font-style: italic; 381 | } 382 | 383 | div.figure p.caption span.caption-text { 384 | } 385 | 386 | /* -- field list styles ----------------------------------------------------- */ 387 | 388 | table.field-list td, table.field-list th { 389 | border: 0 !important; 390 | } 391 | 392 | .field-list ul { 393 | margin: 0; 394 | padding-left: 1em; 395 | } 396 | 397 | .field-list p { 398 | margin: 0; 399 | } 400 | 401 | .field-name { 402 | -moz-hyphens: manual; 403 | -ms-hyphens: manual; 404 | -webkit-hyphens: manual; 405 | hyphens: manual; 406 | } 407 | 408 | /* -- other body styles ----------------------------------------------------- */ 409 | 410 | ol.arabic { 411 | list-style: decimal; 412 | } 413 | 414 | ol.loweralpha { 415 | list-style: lower-alpha; 416 | } 417 | 418 | ol.upperalpha { 419 | list-style: upper-alpha; 420 | } 421 | 422 | ol.lowerroman { 423 | list-style: lower-roman; 424 | } 425 | 426 | ol.upperroman { 427 | list-style: upper-roman; 428 | } 429 | 430 | dl { 431 | margin-bottom: 15px; 432 | } 433 | 434 | dd p { 435 | margin-top: 0px; 436 | } 437 | 438 | dd ul, dd table { 439 | margin-bottom: 10px; 440 | } 441 | 442 | dd { 443 | margin-top: 3px; 444 | margin-bottom: 10px; 445 | margin-left: 30px; 446 | } 447 | 448 | dt:target, span.highlighted { 449 | background-color: #fbe54e; 450 | } 451 | 452 | rect.highlighted { 453 | fill: #fbe54e; 454 | } 455 | 456 | dl.glossary dt { 457 | font-weight: bold; 458 | font-size: 1.1em; 459 | } 460 | 461 | .optional { 462 | font-size: 1.3em; 463 | } 464 | 465 | .sig-paren { 466 | font-size: larger; 467 | } 468 | 469 | .versionmodified { 470 | font-style: italic; 471 | } 472 | 473 | .system-message { 474 | background-color: #fda; 475 | padding: 5px; 476 | border: 3px solid red; 477 | } 478 | 479 | .footnote:target { 480 | background-color: #ffa; 481 | } 482 | 483 | .line-block { 484 | display: block; 485 | margin-top: 1em; 486 | margin-bottom: 1em; 487 | } 488 | 489 | .line-block .line-block { 490 | margin-top: 0; 491 | margin-bottom: 0; 492 | margin-left: 1.5em; 493 | } 494 | 495 | .guilabel, .menuselection { 496 | font-family: sans-serif; 497 | } 498 | 499 | .accelerator { 500 | text-decoration: underline; 501 | } 502 | 503 | .classifier { 504 | font-style: oblique; 505 | } 506 | 507 | abbr, acronym { 508 | border-bottom: dotted 1px; 509 | cursor: help; 510 | } 511 | 512 | /* -- code displays --------------------------------------------------------- */ 513 | 514 | pre { 515 | overflow: auto; 516 | overflow-y: hidden; /* fixes display issues on Chrome browsers */ 517 | } 518 | 519 | span.pre { 520 | -moz-hyphens: none; 521 | -ms-hyphens: none; 522 | -webkit-hyphens: none; 523 | hyphens: none; 524 | } 525 | 526 | td.linenos pre { 527 | padding: 5px 0px; 528 | border: 0; 529 | background-color: transparent; 530 | color: #aaa; 531 | } 532 | 533 | table.highlighttable { 534 | margin-left: 0.5em; 535 | } 536 | 537 | table.highlighttable td { 538 | padding: 0 0.5em 0 0.5em; 539 | } 540 | 541 | div.code-block-caption { 542 | padding: 2px 5px; 543 | font-size: small; 544 | } 545 | 546 | div.code-block-caption code { 547 | background-color: transparent; 548 | } 549 | 550 | div.code-block-caption + div > div.highlight > pre { 551 | margin-top: 0; 552 | } 553 | 554 | div.code-block-caption span.caption-number { 555 | padding: 0.1em 0.3em; 556 | font-style: italic; 557 | } 558 | 559 | div.code-block-caption span.caption-text { 560 | } 561 | 562 | div.literal-block-wrapper { 563 | padding: 1em 1em 0; 564 | } 565 | 566 | div.literal-block-wrapper div.highlight { 567 | margin: 0; 568 | } 569 | 570 | code.descname { 571 | background-color: transparent; 572 | font-weight: bold; 573 | font-size: 1.2em; 574 | } 575 | 576 | code.descclassname { 577 | background-color: transparent; 578 | } 579 | 580 | code.xref, a code { 581 | background-color: transparent; 582 | font-weight: bold; 583 | } 584 | 585 | h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { 586 | background-color: transparent; 587 | } 588 | 589 | .viewcode-link { 590 | float: right; 591 | } 592 | 593 | .viewcode-back { 594 | float: right; 595 | font-family: sans-serif; 596 | } 597 | 598 | div.viewcode-block:target { 599 | margin: -1px -10px; 600 | padding: 0 10px; 601 | } 602 | 603 | /* -- math display ---------------------------------------------------------- */ 604 | 605 | img.math { 606 | vertical-align: middle; 607 | } 608 | 609 | div.body div.math p { 610 | text-align: center; 611 | } 612 | 613 | span.eqno { 614 | float: right; 615 | } 616 | 617 | span.eqno a.headerlink { 618 | position: relative; 619 | left: 0px; 620 | z-index: 1; 621 | } 622 | 623 | div.math:hover a.headerlink { 624 | visibility: visible; 625 | } 626 | 627 | /* -- printout stylesheet --------------------------------------------------- */ 628 | 629 | @media print { 630 | div.document, 631 | div.documentwrapper, 632 | div.bodywrapper { 633 | margin: 0 !important; 634 | width: 100%; 635 | } 636 | 637 | div.sphinxsidebar, 638 | div.related, 639 | div.footer, 640 | #top-link { 641 | display: none; 642 | } 643 | } -------------------------------------------------------------------------------- /doc/_build/html/_static/alabaster.css: -------------------------------------------------------------------------------- 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 | @import url("basic.css"); 54 | 55 | /* -- page layout ----------------------------------------------------------- */ 56 | 57 | body { 58 | font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; 59 | font-size: 17px; 60 | background-color: #fff; 61 | color: #000; 62 | margin: 0; 63 | padding: 0; 64 | } 65 | 66 | 67 | div.document { 68 | width: 940px; 69 | margin: 30px auto 0 auto; 70 | } 71 | 72 | div.documentwrapper { 73 | float: left; 74 | width: 100%; 75 | } 76 | 77 | div.bodywrapper { 78 | margin: 0 0 0 220px; 79 | } 80 | 81 | div.sphinxsidebar { 82 | width: 220px; 83 | font-size: 14px; 84 | line-height: 1.5; 85 | } 86 | 87 | hr { 88 | border: 1px solid #B1B4B6; 89 | } 90 | 91 | div.body { 92 | background-color: #fff; 93 | color: #3E4349; 94 | padding: 0 30px 0 30px; 95 | } 96 | 97 | div.body > .section { 98 | text-align: left; 99 | } 100 | 101 | div.footer { 102 | width: 940px; 103 | margin: 20px auto 30px auto; 104 | font-size: 14px; 105 | color: #888; 106 | text-align: right; 107 | } 108 | 109 | div.footer a { 110 | color: #888; 111 | } 112 | 113 | p.caption { 114 | font-family: inherit; 115 | font-size: inherit; 116 | } 117 | 118 | 119 | div.relations { 120 | display: none; 121 | } 122 | 123 | 124 | div.sphinxsidebar a { 125 | color: #444; 126 | text-decoration: none; 127 | border-bottom: 1px dotted #999; 128 | } 129 | 130 | div.sphinxsidebar a:hover { 131 | border-bottom: 1px solid #999; 132 | } 133 | 134 | div.sphinxsidebarwrapper { 135 | padding: 18px 10px; 136 | } 137 | 138 | div.sphinxsidebarwrapper p.logo { 139 | padding: 0; 140 | margin: -10px 0 0 0px; 141 | text-align: center; 142 | } 143 | 144 | div.sphinxsidebarwrapper h1.logo { 145 | margin-top: -10px; 146 | text-align: center; 147 | margin-bottom: 5px; 148 | text-align: left; 149 | } 150 | 151 | div.sphinxsidebarwrapper h1.logo-name { 152 | margin-top: 0px; 153 | } 154 | 155 | div.sphinxsidebarwrapper p.blurb { 156 | margin-top: 0; 157 | font-style: normal; 158 | } 159 | 160 | div.sphinxsidebar h3, 161 | div.sphinxsidebar h4 { 162 | font-family: 'Garamond', 'Georgia', serif; 163 | color: #444; 164 | font-size: 24px; 165 | font-weight: normal; 166 | margin: 0 0 5px 0; 167 | padding: 0; 168 | } 169 | 170 | div.sphinxsidebar h4 { 171 | font-size: 20px; 172 | } 173 | 174 | div.sphinxsidebar h3 a { 175 | color: #444; 176 | } 177 | 178 | div.sphinxsidebar p.logo a, 179 | div.sphinxsidebar h3 a, 180 | div.sphinxsidebar p.logo a:hover, 181 | div.sphinxsidebar h3 a:hover { 182 | border: none; 183 | } 184 | 185 | div.sphinxsidebar p { 186 | color: #555; 187 | margin: 10px 0; 188 | } 189 | 190 | div.sphinxsidebar ul { 191 | margin: 10px 0; 192 | padding: 0; 193 | color: #000; 194 | } 195 | 196 | div.sphinxsidebar ul li.toctree-l1 > a { 197 | font-size: 120%; 198 | } 199 | 200 | div.sphinxsidebar ul li.toctree-l2 > a { 201 | font-size: 110%; 202 | } 203 | 204 | div.sphinxsidebar input { 205 | border: 1px solid #CCC; 206 | font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; 207 | font-size: 1em; 208 | } 209 | 210 | div.sphinxsidebar hr { 211 | border: none; 212 | height: 1px; 213 | color: #AAA; 214 | background: #AAA; 215 | 216 | text-align: left; 217 | margin-left: 0; 218 | width: 50%; 219 | } 220 | 221 | /* -- body styles ----------------------------------------------------------- */ 222 | 223 | a { 224 | color: #004B6B; 225 | text-decoration: underline; 226 | } 227 | 228 | a:hover { 229 | color: #6D4100; 230 | text-decoration: underline; 231 | } 232 | 233 | div.body h1, 234 | div.body h2, 235 | div.body h3, 236 | div.body h4, 237 | div.body h5, 238 | div.body h6 { 239 | font-family: 'Garamond', 'Georgia', serif; 240 | font-weight: normal; 241 | margin: 30px 0px 10px 0px; 242 | padding: 0; 243 | } 244 | 245 | div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } 246 | div.body h2 { font-size: 180%; } 247 | div.body h3 { font-size: 150%; } 248 | div.body h4 { font-size: 130%; } 249 | div.body h5 { font-size: 100%; } 250 | div.body h6 { font-size: 100%; } 251 | 252 | a.headerlink { 253 | color: #DDD; 254 | padding: 0 4px; 255 | text-decoration: none; 256 | } 257 | 258 | a.headerlink:hover { 259 | color: #444; 260 | background: #EAEAEA; 261 | } 262 | 263 | div.body p, div.body dd, div.body li { 264 | line-height: 1.4em; 265 | } 266 | 267 | div.admonition { 268 | margin: 20px 0px; 269 | padding: 10px 30px; 270 | background-color: #EEE; 271 | border: 1px solid #CCC; 272 | } 273 | 274 | div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { 275 | background-color: #FBFBFB; 276 | border-bottom: 1px solid #fafafa; 277 | } 278 | 279 | div.admonition p.admonition-title { 280 | font-family: 'Garamond', 'Georgia', serif; 281 | font-weight: normal; 282 | font-size: 24px; 283 | margin: 0 0 10px 0; 284 | padding: 0; 285 | line-height: 1; 286 | } 287 | 288 | div.admonition p.last { 289 | margin-bottom: 0; 290 | } 291 | 292 | div.highlight { 293 | background-color: #fff; 294 | } 295 | 296 | dt:target, .highlight { 297 | background: #FAF3E8; 298 | } 299 | 300 | div.warning { 301 | background-color: #FCC; 302 | border: 1px solid #FAA; 303 | } 304 | 305 | div.danger { 306 | background-color: #FCC; 307 | border: 1px solid #FAA; 308 | -moz-box-shadow: 2px 2px 4px #D52C2C; 309 | -webkit-box-shadow: 2px 2px 4px #D52C2C; 310 | box-shadow: 2px 2px 4px #D52C2C; 311 | } 312 | 313 | div.error { 314 | background-color: #FCC; 315 | border: 1px solid #FAA; 316 | -moz-box-shadow: 2px 2px 4px #D52C2C; 317 | -webkit-box-shadow: 2px 2px 4px #D52C2C; 318 | box-shadow: 2px 2px 4px #D52C2C; 319 | } 320 | 321 | div.caution { 322 | background-color: #FCC; 323 | border: 1px solid #FAA; 324 | } 325 | 326 | div.attention { 327 | background-color: #FCC; 328 | border: 1px solid #FAA; 329 | } 330 | 331 | div.important { 332 | background-color: #EEE; 333 | border: 1px solid #CCC; 334 | } 335 | 336 | div.note { 337 | background-color: #EEE; 338 | border: 1px solid #CCC; 339 | } 340 | 341 | div.tip { 342 | background-color: #EEE; 343 | border: 1px solid #CCC; 344 | } 345 | 346 | div.hint { 347 | background-color: #EEE; 348 | border: 1px solid #CCC; 349 | } 350 | 351 | div.seealso { 352 | background-color: #EEE; 353 | border: 1px solid #CCC; 354 | } 355 | 356 | div.topic { 357 | background-color: #EEE; 358 | } 359 | 360 | p.admonition-title { 361 | display: inline; 362 | } 363 | 364 | p.admonition-title:after { 365 | content: ":"; 366 | } 367 | 368 | pre, tt, code { 369 | font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; 370 | font-size: 0.9em; 371 | } 372 | 373 | .hll { 374 | background-color: #FFC; 375 | margin: 0 -12px; 376 | padding: 0 12px; 377 | display: block; 378 | } 379 | 380 | img.screenshot { 381 | } 382 | 383 | tt.descname, tt.descclassname, code.descname, code.descclassname { 384 | font-size: 0.95em; 385 | } 386 | 387 | tt.descname, code.descname { 388 | padding-right: 0.08em; 389 | } 390 | 391 | img.screenshot { 392 | -moz-box-shadow: 2px 2px 4px #EEE; 393 | -webkit-box-shadow: 2px 2px 4px #EEE; 394 | box-shadow: 2px 2px 4px #EEE; 395 | } 396 | 397 | table.docutils { 398 | border: 1px solid #888; 399 | -moz-box-shadow: 2px 2px 4px #EEE; 400 | -webkit-box-shadow: 2px 2px 4px #EEE; 401 | box-shadow: 2px 2px 4px #EEE; 402 | } 403 | 404 | table.docutils td, table.docutils th { 405 | border: 1px solid #888; 406 | padding: 0.25em 0.7em; 407 | } 408 | 409 | table.field-list, table.footnote { 410 | border: none; 411 | -moz-box-shadow: none; 412 | -webkit-box-shadow: none; 413 | box-shadow: none; 414 | } 415 | 416 | table.footnote { 417 | margin: 15px 0; 418 | width: 100%; 419 | border: 1px solid #EEE; 420 | background: #FDFDFD; 421 | font-size: 0.9em; 422 | } 423 | 424 | table.footnote + table.footnote { 425 | margin-top: -15px; 426 | border-top: none; 427 | } 428 | 429 | table.field-list th { 430 | padding: 0 0.8em 0 0; 431 | } 432 | 433 | table.field-list td { 434 | padding: 0; 435 | } 436 | 437 | table.field-list p { 438 | margin-bottom: 0.8em; 439 | } 440 | 441 | /* Cloned from 442 | * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 443 | */ 444 | .field-name { 445 | -moz-hyphens: manual; 446 | -ms-hyphens: manual; 447 | -webkit-hyphens: manual; 448 | hyphens: manual; 449 | } 450 | 451 | table.footnote td.label { 452 | width: .1px; 453 | padding: 0.3em 0 0.3em 0.5em; 454 | } 455 | 456 | table.footnote td { 457 | padding: 0.3em 0.5em; 458 | } 459 | 460 | dl { 461 | margin: 0; 462 | padding: 0; 463 | } 464 | 465 | dl dd { 466 | margin-left: 30px; 467 | } 468 | 469 | blockquote { 470 | margin: 0 0 0 30px; 471 | padding: 0; 472 | } 473 | 474 | ul, ol { 475 | /* Matches the 30px from the narrow-screen "li > ul" selector below */ 476 | margin: 10px 0 10px 30px; 477 | padding: 0; 478 | } 479 | 480 | pre { 481 | background: #EEE; 482 | padding: 7px 30px; 483 | margin: 15px 0px; 484 | line-height: 1.3em; 485 | } 486 | 487 | div.viewcode-block:target { 488 | background: #ffd; 489 | } 490 | 491 | dl pre, blockquote pre, li pre { 492 | margin-left: 0; 493 | padding-left: 30px; 494 | } 495 | 496 | tt, code { 497 | background-color: #ecf0f3; 498 | color: #222; 499 | /* padding: 1px 2px; */ 500 | } 501 | 502 | tt.xref, code.xref, a tt { 503 | background-color: #FBFBFB; 504 | border-bottom: 1px solid #fff; 505 | } 506 | 507 | a.reference { 508 | text-decoration: none; 509 | border-bottom: 1px dotted #004B6B; 510 | } 511 | 512 | /* Don't put an underline on images */ 513 | a.image-reference, a.image-reference:hover { 514 | border-bottom: none; 515 | } 516 | 517 | a.reference:hover { 518 | border-bottom: 1px solid #6D4100; 519 | } 520 | 521 | a.footnote-reference { 522 | text-decoration: none; 523 | font-size: 0.7em; 524 | vertical-align: top; 525 | border-bottom: 1px dotted #004B6B; 526 | } 527 | 528 | a.footnote-reference:hover { 529 | border-bottom: 1px solid #6D4100; 530 | } 531 | 532 | a:hover tt, a:hover code { 533 | background: #EEE; 534 | } 535 | 536 | 537 | @media screen and (max-width: 870px) { 538 | 539 | div.sphinxsidebar { 540 | display: none; 541 | } 542 | 543 | div.document { 544 | width: 100%; 545 | 546 | } 547 | 548 | div.documentwrapper { 549 | margin-left: 0; 550 | margin-top: 0; 551 | margin-right: 0; 552 | margin-bottom: 0; 553 | } 554 | 555 | div.bodywrapper { 556 | margin-top: 0; 557 | margin-right: 0; 558 | margin-bottom: 0; 559 | margin-left: 0; 560 | } 561 | 562 | ul { 563 | margin-left: 0; 564 | } 565 | 566 | li > ul { 567 | /* Matches the 30px from the "ul, ol" selector above */ 568 | margin-left: 30px; 569 | } 570 | 571 | .document { 572 | width: auto; 573 | } 574 | 575 | .footer { 576 | width: auto; 577 | } 578 | 579 | .bodywrapper { 580 | margin: 0; 581 | } 582 | 583 | .footer { 584 | width: auto; 585 | } 586 | 587 | .github { 588 | display: none; 589 | } 590 | 591 | 592 | 593 | } 594 | 595 | 596 | 597 | @media screen and (max-width: 875px) { 598 | 599 | body { 600 | margin: 0; 601 | padding: 20px 30px; 602 | } 603 | 604 | div.documentwrapper { 605 | float: none; 606 | background: #fff; 607 | } 608 | 609 | div.sphinxsidebar { 610 | display: block; 611 | float: none; 612 | width: 102.5%; 613 | margin: 50px -30px -20px -30px; 614 | padding: 10px 20px; 615 | background: #333; 616 | color: #FFF; 617 | } 618 | 619 | div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, 620 | div.sphinxsidebar h3 a { 621 | color: #fff; 622 | } 623 | 624 | div.sphinxsidebar a { 625 | color: #AAA; 626 | } 627 | 628 | div.sphinxsidebar p.logo { 629 | display: none; 630 | } 631 | 632 | div.document { 633 | width: 100%; 634 | margin: 0; 635 | } 636 | 637 | div.footer { 638 | display: none; 639 | } 640 | 641 | div.bodywrapper { 642 | margin: 0; 643 | } 644 | 645 | div.body { 646 | min-height: 0; 647 | padding: 0; 648 | } 649 | 650 | .rtd_doc_footer { 651 | display: none; 652 | } 653 | 654 | .document { 655 | width: auto; 656 | } 657 | 658 | .footer { 659 | width: auto; 660 | } 661 | 662 | .footer { 663 | width: auto; 664 | } 665 | 666 | .github { 667 | display: none; 668 | } 669 | } 670 | 671 | 672 | /* misc. */ 673 | 674 | .revsys-inline { 675 | display: none!important; 676 | } 677 | 678 | /* Make nested-list/multi-paragraph items look better in Releases changelog 679 | * pages. Without this, docutils' magical list fuckery causes inconsistent 680 | * formatting between different release sub-lists. 681 | */ 682 | div#changelog > div.section > ul > li > p:only-child { 683 | margin-bottom: 0; 684 | } 685 | 686 | /* Hide fugly table cell borders in ..bibliography:: directive output */ 687 | table.docutils.citation, table.docutils.citation td, table.docutils.citation th { 688 | border: none; 689 | /* Below needed in some edge cases; if not applied, bottom shadows appear */ 690 | -moz-box-shadow: none; 691 | -webkit-box-shadow: none; 692 | box-shadow: none; 693 | } -------------------------------------------------------------------------------- /doc/_build/html/WeChatPay.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | WeChatPay — wechat-pay-sdk 0.4 documentation 9 | 10 | 11 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 |
40 |
41 |
42 | 43 |
44 |

WeChatPay

45 |
46 |
47 | class WeChatPay(appid, mch_id, notify_url, pay_secret, cert=None, key=None)
48 |
49 |
50 | unifiedorder(device_info, sign_type, fee_type, trade_type, **kwargs)
51 |

Form a new order. more information at 52 | API

53 | 54 | 55 | 56 | 57 | 77 | 78 | 80 | 81 | 82 |
Parameters:
    58 |
  • device_info – exception type
  • 59 |
  • sign_type – sign method(MD5 or HMAC-SHA256)
  • 60 |
  • fee_type – currency type
  • 61 |
  • attach – attach data
  • 62 |
  • out_trade_no – order id (should be unique in your system)
  • 63 |
  • trade_type(JSAPI,NATIVE,APP)
  • 64 |
  • body – order description
  • 65 |
  • detail – item detail
  • 66 |
  • total_fee – the amount of fee
  • 67 |
  • spbill_create_ip – client ip address
  • 68 |
  • time_start – order generate time (format yyyyMMddHHmmss)
  • 69 |
  • time_expire – order expire time (format yyyyMMddHHmmss)
  • 70 |
  • goods_tagdiscount info
  • 71 |
  • product_id – item id
  • 72 |
  • limit_pay – no_credit
  • 73 |
  • openid – user wechat openid
  • 74 |
  • scene_info – scenario info
  • 75 |
76 |
Return type:

UnifiedorderResult

79 |
83 |
84 | 85 |
86 |
87 | random_str()
88 |

Generate a random string

89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 |
Return type:string
97 |
98 | 99 |
100 |
101 | verify_notify(req)
102 |

Verify WeChat payment notification

103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 |
Parameters:req – Request object from requests
Return type:NotifyResult or ErrorResult
113 |
114 | 115 |
116 |
117 | to_xml(dct)
118 |

Transfer a dict to xml string 119 | :param dct: data dict to send 120 | :rtype: string

121 |
122 | 123 |
124 |
125 | sendbox_sign()
126 |

Generate sendbox secret key 127 | API

128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 |
Return type:SendBoxKey
136 |
137 | 138 |
139 |
140 | query_order(**kwargs)
141 |

Query order from WeChat 142 | API

143 | 144 | 145 | 146 | 147 | 152 | 153 | 155 | 156 | 157 |
Parameters:
    148 |
  • transaction_id – wechat order id
  • 149 |
  • out_trade_no – order id (transaction_id and out_trade_no only need one)
  • 150 |
151 |
Return type:

OrderResult

154 |
158 |
159 | 160 |
161 |
162 | downloadbill(bill_date, sign_type='MD5', bill_type='ALL', tar_type='GZIP')
163 |

Download bills 164 | API

165 | 166 | 167 | 168 | 169 | 175 | 176 | 178 | 179 | 180 |
Parameters:
    170 |
  • bill_date – the date of bill (format yyyymmdd)
  • 171 |
  • bill_type – the type of bill (ALL, SUCCESS, REFUND, RECHARGE_REFUND)
  • 172 |
  • tar_type – tar type(GZIP)
  • 173 |
174 |
Return type:

DownLoadBillResult

177 |
181 |
182 | 183 |
184 |
185 | close_order(out_trade_no, sign_type='MD5')
186 |

Close order 187 | API

188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 |
Parameters:out_trade_no – order id
Return type:CloseOrderResult
198 |
199 | 200 |
201 |
202 | short_url(long_url, sign_type='MD5')
203 |

Convert long url to short url and make the Qr code more recognizable 204 | API

205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 |
Parameters:long_url – long url
Return type:ShortUrlResult
215 |
216 | 217 |
218 |
219 | refund(out_trade_no, out_refund_no, total_fee, refund_fee, sign_type='MD5', refund_fee_type='CNY', **kwargs)
220 |

Method for refund 221 | this method need you to proide your cert.pem and key.pem file 222 | API

223 | 224 | 225 | 226 | 227 | 238 | 239 | 241 | 242 | 243 |
Parameters:
    228 |
  • transaction_id – wechat order id
  • 229 |
  • out_trade_no – order id (transaction_id and out_trade_no only need one)
  • 230 |
  • out_refund_no – refund id
  • 231 |
  • total_fee – total order fee
  • 232 |
  • refund_fee – refund total fee
  • 233 |
  • refund_fee_type – currency type (CNY)
  • 234 |
  • refund_desc – refund reason
  • 235 |
  • refund_account – refund account
  • 236 |
237 |
Return type:

:py:class::RefundResult

240 |
244 |
245 | 246 |
247 |
248 | refund_query(out_refund_no, sign_type='MD5', **kwargs)
249 |

Query refund process 250 | API 251 | :param transaction_id: wechat order id 252 | :param out_trade_no: order id 253 | :param out_refund_no: refund id 254 | :param refund_id: refund id from WeChat (transaction_id, out_trade_no, out_refund_no, refund_id only need to one) 255 | :param offset: query offset 256 | :rtype: :py:class::RefundQueryResult

257 |
258 | 259 |
260 | 261 |
262 | 263 | 264 |
265 |
266 |
267 | 308 |
309 |
310 | 321 | 322 | 323 | 324 | 325 | 326 | -------------------------------------------------------------------------------- /doc/_build/html/_static/searchtools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * searchtools.js_t 3 | * ~~~~~~~~~~~~~~~~ 4 | * 5 | * Sphinx JavaScript utilities for the full-text search. 6 | * 7 | * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | 13 | /* Non-minified version JS is _stemmer.js if file is provided */ 14 | /** 15 | * Porter Stemmer 16 | */ 17 | var Stemmer = function() { 18 | 19 | var step2list = { 20 | ational: 'ate', 21 | tional: 'tion', 22 | enci: 'ence', 23 | anci: 'ance', 24 | izer: 'ize', 25 | bli: 'ble', 26 | alli: 'al', 27 | entli: 'ent', 28 | eli: 'e', 29 | ousli: 'ous', 30 | ization: 'ize', 31 | ation: 'ate', 32 | ator: 'ate', 33 | alism: 'al', 34 | iveness: 'ive', 35 | fulness: 'ful', 36 | ousness: 'ous', 37 | aliti: 'al', 38 | iviti: 'ive', 39 | biliti: 'ble', 40 | logi: 'log' 41 | }; 42 | 43 | var step3list = { 44 | icate: 'ic', 45 | ative: '', 46 | alize: 'al', 47 | iciti: 'ic', 48 | ical: 'ic', 49 | ful: '', 50 | ness: '' 51 | }; 52 | 53 | var c = "[^aeiou]"; // consonant 54 | var v = "[aeiouy]"; // vowel 55 | var C = c + "[^aeiouy]*"; // consonant sequence 56 | var V = v + "[aeiou]*"; // vowel sequence 57 | 58 | var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 59 | var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 60 | var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 61 | var s_v = "^(" + C + ")?" + v; // vowel in stem 62 | 63 | this.stemWord = function (w) { 64 | var stem; 65 | var suffix; 66 | var firstch; 67 | var origword = w; 68 | 69 | if (w.length < 3) 70 | return w; 71 | 72 | var re; 73 | var re2; 74 | var re3; 75 | var re4; 76 | 77 | firstch = w.substr(0,1); 78 | if (firstch == "y") 79 | w = firstch.toUpperCase() + w.substr(1); 80 | 81 | // Step 1a 82 | re = /^(.+?)(ss|i)es$/; 83 | re2 = /^(.+?)([^s])s$/; 84 | 85 | if (re.test(w)) 86 | w = w.replace(re,"$1$2"); 87 | else if (re2.test(w)) 88 | w = w.replace(re2,"$1$2"); 89 | 90 | // Step 1b 91 | re = /^(.+?)eed$/; 92 | re2 = /^(.+?)(ed|ing)$/; 93 | if (re.test(w)) { 94 | var fp = re.exec(w); 95 | re = new RegExp(mgr0); 96 | if (re.test(fp[1])) { 97 | re = /.$/; 98 | w = w.replace(re,""); 99 | } 100 | } 101 | else if (re2.test(w)) { 102 | var fp = re2.exec(w); 103 | stem = fp[1]; 104 | re2 = new RegExp(s_v); 105 | if (re2.test(stem)) { 106 | w = stem; 107 | re2 = /(at|bl|iz)$/; 108 | re3 = new RegExp("([^aeiouylsz])\\1$"); 109 | re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 110 | if (re2.test(w)) 111 | w = w + "e"; 112 | else if (re3.test(w)) { 113 | re = /.$/; 114 | w = w.replace(re,""); 115 | } 116 | else if (re4.test(w)) 117 | w = w + "e"; 118 | } 119 | } 120 | 121 | // Step 1c 122 | re = /^(.+?)y$/; 123 | if (re.test(w)) { 124 | var fp = re.exec(w); 125 | stem = fp[1]; 126 | re = new RegExp(s_v); 127 | if (re.test(stem)) 128 | w = stem + "i"; 129 | } 130 | 131 | // Step 2 132 | re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 133 | if (re.test(w)) { 134 | var fp = re.exec(w); 135 | stem = fp[1]; 136 | suffix = fp[2]; 137 | re = new RegExp(mgr0); 138 | if (re.test(stem)) 139 | w = stem + step2list[suffix]; 140 | } 141 | 142 | // Step 3 143 | re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 144 | if (re.test(w)) { 145 | var fp = re.exec(w); 146 | stem = fp[1]; 147 | suffix = fp[2]; 148 | re = new RegExp(mgr0); 149 | if (re.test(stem)) 150 | w = stem + step3list[suffix]; 151 | } 152 | 153 | // Step 4 154 | re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 155 | re2 = /^(.+?)(s|t)(ion)$/; 156 | if (re.test(w)) { 157 | var fp = re.exec(w); 158 | stem = fp[1]; 159 | re = new RegExp(mgr1); 160 | if (re.test(stem)) 161 | w = stem; 162 | } 163 | else if (re2.test(w)) { 164 | var fp = re2.exec(w); 165 | stem = fp[1] + fp[2]; 166 | re2 = new RegExp(mgr1); 167 | if (re2.test(stem)) 168 | w = stem; 169 | } 170 | 171 | // Step 5 172 | re = /^(.+?)e$/; 173 | if (re.test(w)) { 174 | var fp = re.exec(w); 175 | stem = fp[1]; 176 | re = new RegExp(mgr1); 177 | re2 = new RegExp(meq1); 178 | re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 179 | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 180 | w = stem; 181 | } 182 | re = /ll$/; 183 | re2 = new RegExp(mgr1); 184 | if (re.test(w) && re2.test(w)) { 185 | re = /.$/; 186 | w = w.replace(re,""); 187 | } 188 | 189 | // and turn initial Y back to y 190 | if (firstch == "y") 191 | w = firstch.toLowerCase() + w.substr(1); 192 | return w; 193 | } 194 | } 195 | 196 | 197 | 198 | /** 199 | * Simple result scoring code. 200 | */ 201 | var Scorer = { 202 | // Implement the following function to further tweak the score for each result 203 | // The function takes a result array [filename, title, anchor, descr, score] 204 | // and returns the new score. 205 | /* 206 | score: function(result) { 207 | return result[4]; 208 | }, 209 | */ 210 | 211 | // query matches the full name of an object 212 | objNameMatch: 11, 213 | // or matches in the last dotted part of the object name 214 | objPartialMatch: 6, 215 | // Additive scores depending on the priority of the object 216 | objPrio: {0: 15, // used to be importantResults 217 | 1: 5, // used to be objectResults 218 | 2: -5}, // used to be unimportantResults 219 | // Used when the priority is not in the mapping. 220 | objPrioDefault: 0, 221 | 222 | // query found in title 223 | title: 15, 224 | // query found in terms 225 | term: 5 226 | }; 227 | 228 | 229 | 230 | 231 | 232 | var splitChars = (function() { 233 | var result = {}; 234 | var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, 235 | 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, 236 | 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, 237 | 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, 238 | 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, 239 | 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, 240 | 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, 241 | 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, 242 | 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, 243 | 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; 244 | var i, j, start, end; 245 | for (i = 0; i < singles.length; i++) { 246 | result[singles[i]] = true; 247 | } 248 | var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], 249 | [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], 250 | [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], 251 | [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], 252 | [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], 253 | [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], 254 | [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], 255 | [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], 256 | [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], 257 | [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], 258 | [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], 259 | [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], 260 | [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], 261 | [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], 262 | [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], 263 | [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], 264 | [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], 265 | [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], 266 | [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], 267 | [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], 268 | [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], 269 | [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], 270 | [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], 271 | [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], 272 | [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], 273 | [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], 274 | [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], 275 | [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], 276 | [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], 277 | [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], 278 | [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], 279 | [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], 280 | [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], 281 | [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], 282 | [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], 283 | [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], 284 | [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], 285 | [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], 286 | [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], 287 | [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], 288 | [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], 289 | [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], 290 | [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], 291 | [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], 292 | [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], 293 | [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], 294 | [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], 295 | [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], 296 | [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; 297 | for (i = 0; i < ranges.length; i++) { 298 | start = ranges[i][0]; 299 | end = ranges[i][1]; 300 | for (j = start; j <= end; j++) { 301 | result[j] = true; 302 | } 303 | } 304 | return result; 305 | })(); 306 | 307 | function splitQuery(query) { 308 | var result = []; 309 | var start = -1; 310 | for (var i = 0; i < query.length; i++) { 311 | if (splitChars[query.charCodeAt(i)]) { 312 | if (start !== -1) { 313 | result.push(query.slice(start, i)); 314 | start = -1; 315 | } 316 | } else if (start === -1) { 317 | start = i; 318 | } 319 | } 320 | if (start !== -1) { 321 | result.push(query.slice(start)); 322 | } 323 | return result; 324 | } 325 | 326 | 327 | 328 | 329 | /** 330 | * Search Module 331 | */ 332 | var Search = { 333 | 334 | _index : null, 335 | _queued_query : null, 336 | _pulse_status : -1, 337 | 338 | init : function() { 339 | var params = $.getQueryParameters(); 340 | if (params.q) { 341 | var query = params.q[0]; 342 | $('input[name="q"]')[0].value = query; 343 | this.performSearch(query); 344 | } 345 | }, 346 | 347 | loadIndex : function(url) { 348 | $.ajax({type: "GET", url: url, data: null, 349 | dataType: "script", cache: true, 350 | complete: function(jqxhr, textstatus) { 351 | if (textstatus != "success") { 352 | document.getElementById("searchindexloader").src = url; 353 | } 354 | }}); 355 | }, 356 | 357 | setIndex : function(index) { 358 | var q; 359 | this._index = index; 360 | if ((q = this._queued_query) !== null) { 361 | this._queued_query = null; 362 | Search.query(q); 363 | } 364 | }, 365 | 366 | hasIndex : function() { 367 | return this._index !== null; 368 | }, 369 | 370 | deferQuery : function(query) { 371 | this._queued_query = query; 372 | }, 373 | 374 | stopPulse : function() { 375 | this._pulse_status = 0; 376 | }, 377 | 378 | startPulse : function() { 379 | if (this._pulse_status >= 0) 380 | return; 381 | function pulse() { 382 | var i; 383 | Search._pulse_status = (Search._pulse_status + 1) % 4; 384 | var dotString = ''; 385 | for (i = 0; i < Search._pulse_status; i++) 386 | dotString += '.'; 387 | Search.dots.text(dotString); 388 | if (Search._pulse_status > -1) 389 | window.setTimeout(pulse, 500); 390 | } 391 | pulse(); 392 | }, 393 | 394 | /** 395 | * perform a search for something (or wait until index is loaded) 396 | */ 397 | performSearch : function(query) { 398 | // create the required interface elements 399 | this.out = $('#search-results'); 400 | this.title = $('

' + _('Searching') + '

').appendTo(this.out); 401 | this.dots = $('').appendTo(this.title); 402 | this.status = $('

').appendTo(this.out); 403 | this.output = $('