diff --git a/README.rst b/README.rst index 2f2fd04..fd5ea35 100644 --- a/README.rst +++ b/README.rst @@ -220,6 +220,24 @@ verify notify from alipay server, example in Pyramid Application # this is a invalid notify +Single Trade Query +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. + + 单笔交易查询 + +文档:http://wenku.baidu.com/link?url=WLjyz-H6AlfDLIU7kR4LcVNQgxSTMxX61fW0tDCE8yZbqXflCd0CVFsZaIKbRFDvVLaFlq0Q3wcJ935A7Kw-mRSs0iA4wQu8cLaCe5B8FIq + +.. code-block:: python + + import re + xml = alipay.single_trade_query(out_trade_no="10000005") + res = re.findall('(\S+)', xml) # use RE to find trade_status, xml parsing is more useful, in fact. + status = None if not res else res[0] + print status # will print out TRADE_SUCCESS when trade is success + + Example in Pyramid Application ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/alipay/__init__.py b/src/alipay/__init__.py index 9effbea..1eee9eb 100644 --- a/src/alipay/__init__.py +++ b/src/alipay/__init__.py @@ -62,10 +62,15 @@ def _check_params(self, params, names): if not all(k in params for k in names): raise MissingParameter('missing parameters') - def _build_url(self, service, **kw): + def _build_url(self, service, paramnames=None, **kw): + ''' + 创建带签名的请求地址,paramnames为需要包含的参数名,用于避免出现过多的参数,默认使用全部参数 + ''' params = self.default_params.copy() params['service'] = service params.update(kw) + if paramnames: + params = dict([(k, params[k]) for k in paramnames if k in params]) signkey, signvalue, signdescription = self.sign_tuple signmethod = getattr( self, @@ -207,6 +212,18 @@ def check_notify_remotely(self, **kw): ).text return remote_result == 'true' + def single_trade_query(self, **kw): + ''' + 单笔交易查询,返回xml. + out_trade_no或者trade_no参数必须有一个. + 该接口需要联系支付宝客服签约. + ''' + if 'trade_no' not in kw and 'out_trade_no' not in kw: + raise MissingParameter('missing parameters') + url = self._build_url('single_trade_query', paramnames=['service', 'partner', '_input_charset', 'sign', 'sign_type', 'trade_no', 'out_trade_no'], **kw) + remote_result = requests.get(url, headers={'connection': 'close'}).text + return remote_result + '''Wap支付接口''' @@ -257,7 +274,7 @@ def create_direct_pay_by_user_url(self, **kw): raise TokenAuthorizationError(unquote(params['res_error'][0])) else: token = kw['token'] - params = {'req_data': self._xmlnode % + params = {'req_data': self._xmlnode % (self.AUTH_ROOT_NODE, (self._xmlnode % ('request_token', token, 'request_token')), self.AUTH_ROOT_NODE)} diff --git a/src/alipay/tests.py b/src/alipay/tests.py index 5ceeb49..26d7c31 100644 --- a/src/alipay/tests.py +++ b/src/alipay/tests.py @@ -196,3 +196,10 @@ def test_wap_notifyurl(self): 'sign': '1f0a524dc51ed5bfc7ee2bac62e39534'} rt = self.wapalipay.verify_notify(**params) self.assertFalse(rt) + + def test_single_trade_query(self): + ''' single_trade_query will response a ILLEGAL_PARTNER error xml document, like: + + FILLEGAL_PARTNER + ''' + self.assertIn('ILLEGAL_PARTNER', self.alipay.single_trade_query(out_trade_no='2015102012')) \ No newline at end of file