摘要:近期在項目的開發過程中需要用到的退款功能由于使用的版本比官方提供的要低個小版本因此問題并不是很大。然后我們通過得類的方法獲取給定然后再根據其屬性得方法傳入關鍵字參數來實現退款的操作。需要提示的是參數只能是最大個字符不然又會出現一些問題。
近期在項目的開發過程中,需要用到ping++的退款功能,由于使用的版本比官方提供的要低2個小版本,因此問題并不是很大。但是由于官方文檔有些內容寫的比較含蓄,因此遇到了一些問題。
我們可以通過如下的方式來獲取SDK的版本:
>>> import pingpp >>> pingpp.VERSION "2.0.7" >>> pingpp.api_version "2.0.7"
在官方文檔得說明中,我們可以看到這樣3句代碼:
import pingpp pingpp.api_key = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC" ch = pingpp.Charge.retrieve("CH-ID") re = ch.refunds.create(description="desc", amount=1)入坑
在這里,我們看到我們先導入pingpp庫,然后通過賦值的方式將其傳入。然后我們通過pingpp得Charge類的retrieve方法獲取給定ch_id,然后再根據其refunds屬性得create方法傳入關鍵字參數來實現退款的操作。
如果我們沒有傳入api_key,將得到1個AuthenticationError權限錯誤:
AuthenticationError: No API key provided. (HINT: set your API key using "pingpp.api_key ="). You can generate API keys from the Ping++ web interface. See https://pingxx.com for details, or email support@pingxx.com if you have a ny questions.
在這里,我按照官方提供的方式進行賦值,直接就出現上面的情況了,讓人比較納悶。
出坑下面我們來看下其實現的源碼,在resource模塊下的Charge類繼承自3個類,分別為CreateableAPIResource, ListableAPIResource,UpdateableAPIResource。其源碼如下:
class Charge(CreateableAPIResource, ListableAPIResource, UpdateableAPIResource): def refund(self, **params): ...
而這3個父類繼承自APIResource類,而APIResource類繼承自PingppObject類,它是1個Pingpp對象。
class CreateableAPIResource(APIResource): @classmethod def create(cls, api_key=None, **params): requestor = api_requestor.APIRequestor(api_key) url = cls.class_url() response, api_key = requestor.request("post", url, params) return convert_to_pingpp_object(response, api_key) class APIResource(PingppObject): @classmethod def retrieve(cls, id, api_key=None, **params): instance = cls(id, api_key, **params) instance.refresh() return instance def refresh(self): self.refresh_from(self.request("get", self.instance_url())) return self @classmethod def class_name(cls): ... return str(urllib.quote_plus(cls.__name__.lower())) @classmethod def class_url(cls): cls_name = cls.class_name() return "/v1/%ss" % (cls_name,) def instance_url(self): ... extn = urllib.quote_plus(id) return "%s/%s" % (base, extn)
從上述代碼,我們可以發現,我們還可以直接將api_key以關鍵字參數的形式傳入到retrieve方法中。
我們調用Charge類的retrieve方法時,其會生成1個實例,然后調用該實例得refresh方法。而后調研該實例的refresh_from方法,使用get請求,而地址為該實例的url。
因此,最終的url地址為https://api.pingxx.com/v1/charges/,首先class_name方法返回Charge類名的小寫名稱,而后在class_url方法中進行組裝后返回給instance_url方法。
而在調用request方法的過程中,我們會涉及到1個convert_to_pingpp_object方法,其將響應的內容轉換為pingpp對象。
通過這種方式我們完成了官方文檔中查詢Charge對象的操作,即進行如下的操作:
GET https://api.pingxx.com/v1/charges/{CHARGE_ID}
因此,上面ch最終的結果為我們使用API調用后得到的JSON數據結果,而后我們通過ch的refunds屬性得到這樣1個對象:
... "refunds": { "url": "/v1/charges/ch_xxx/refunds", "has_more": false, "object": "list", "data": [ { ... } ] }
而這個轉換的過程是在refresh_from函數中進行的:
def refresh_from(self, values, api_key=None, partial=False): ... for k, v in values.iteritems(): super(PingppObject, self).__setitem__( k, convert_to_pingpp_object(v, api_key))
而后我們通過object屬性獲取到ch.refunds的結果為list。通過如下的方式我們得到的ch.refunds為1個ListObject:
def convert_to_pingpp_object(resp,api_key): klass_name = resp.get("object") if isinstance(klass_name, basestring): klass = types.get(klass_name, PingppObject)
這樣,我們在create方法中傳入的參數與API文檔中創建Refund對象的參數一一對應了。而這些傳入的參數將在調用api_requestor模塊中得APIRequestor類時傳入。其中,url為refund對象中的url屬性,即上面的/v1/charges/ch_xxx/refunds。
因此,第3行中的關鍵字參數description和amount正好對應官方文檔中的說明。需要提示的是,description參數只能是最大255個unicode字符,不然又會出現一些問題。
其實ping++的SDK是與其API接口對應的,如果你在使用SDK的過程中對其傳入的參數不明確,可以查看API文檔相應篇章中的說明。不然你會遇到ping++平臺給你返回一些讓你摸不著頭腦的回復。
原文:
http://yuki-onna.github.io/jump-out-of-the-refund-of-ping++/
參考文章:
https://www.pingxx.com/api#api-r-new
https://www.pingxx.com/guidance/server/charge/refund
https://github.com/PingPlusPlus/pingpp-python/blob/2.0.7/example/refund.py
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37877.html
摘要:近期在做微信支付那方面的工作由于要在之前開發人員的基礎上進行開發其中使用到了這個第方支付的。下面梳理下正常開發的流程請點擊下面的鏈接付款。結果總是提示必須是組鍵值對。主要是官方沒有提供明確的請求頭信息給我們導致我們一直在兜圈。 近期在做微信支付那方面的工作,由于要在之前開發人員的基礎上進行開發,其中使用到了ping++這個第3方支付的SDK。不得不說,ping++的SDK做的挺簡單的,...
摘要:近期在做微信支付那方面的工作由于要在之前開發人員的基礎上進行開發其中使用到了這個第方支付的。下面梳理下正常開發的流程請點擊下面的鏈接付款。結果總是提示必須是組鍵值對。主要是官方沒有提供明確的請求頭信息給我們導致我們一直在兜圈。 近期在做微信支付那方面的工作,由于要在之前開發人員的基礎上進行開發,其中使用到了ping++這個第3方支付的SDK。不得不說,ping++的SDK做的挺簡單的,...
摘要:老周互聯怎么樣,老周互聯好不好,老周互聯隸屬于老周網絡科技部旗下,創立于年月份,是一家具有代表性的國人商家。目前主營的產品有云服務器,標簽裸金屬服務器下的日志裸金屬服務器。人工客服測試標簽下的日志香港測試 老周互聯怎么樣,老周互聯好不好,老周互聯隸屬于老周網絡科技部旗下,創立于2019年12月份,是一家具有代表性的國人商家。目前主營的產品有云服務器,裸金屬服務器。創辦一年多以...
摘要:怎么樣,好不好,,國人穩定商家,提供洛杉磯香港俄羅斯伯力泉州等。現在泉州有折優惠,標簽獨立下的日志獨立,國內直連等國際鏈路,有需要的可以關注一下。CloudIPLC怎么樣,CloudIPLC好不好,CloudIPLC,國人穩定商家,提供洛杉磯KVM VPS、香港CMI KVM VPS、俄羅斯伯力KVM VPS、泉州CN2 KVM VPS等。現在泉州CN2 VDS有77折優惠,獨立IP,國內A...
閱讀 1946·2021-11-15 17:58
閱讀 2133·2021-10-19 11:45
閱讀 3489·2021-09-02 15:40
閱讀 2599·2021-07-25 10:50
閱讀 3748·2019-08-30 15:56
閱讀 3150·2019-08-30 12:44
閱讀 1031·2019-08-26 13:38
閱讀 1873·2019-08-23 18:29