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