def pay_result_by_order_no(self, order_no): """ 根据订单号查询支付结果 :param order_no: 本系统的订单号 :rtype:dict :return: """ params = dict( service_code='11', sp_no=self.seller_no, order_no=order_no, output_type=1, output_charset=1, version=3, sign_method=1 ) sign = self.make_sign(**params) params["sign"] = sign rep_xml = self._get( url='https://www.baifubao.com/api/0/query/0/pay_result_by_order_no', params=params ) rep_dict = xml_json.parse(rep_xml) query_status = rep_dict['response']['query_status'] check_rep, msg = self.__check_query_status(query_status) if check_rep: pay_result = rep_dict['response']['pay_result'] return {"code": pay_result, "msg": self.__pay_status(pay_result)} return {"code": query_status, "msg": msg}
def app_refund(self, trade_no, refund_no, order_no, total_fee, refund_fee): """ app(财付通)退款 :param trade_no: 交易流水号 :param refund_no: 退款单号 :param order_no: 订单号 :param total_fee: 交易总金额(分) :param refund_fee: 退款金额(分) :rtype: tuple :return: """ md5_pwd = hashlib.md5(self.__op_user_pwd).hexdigest().upper() prepay_data = dict( service_version='1.1', partner=self.__partner_id, out_trade_no=order_no, transaction_id=trade_no, out_refund_no=refund_no, refund_fee=refund_fee, total_fee=total_fee, op_user_id=self.__partner_id, op_user_passwd=md5_pwd, input_charset='UTF-8', recv_user_id='', reccv_user_name='' ) sign_param = self.filter_params(**prepay_data) prepay_data["sign"] = self.make_sign(sign_param=sign_param) join_str_list = [] for key, value in prepay_data.iteritems(): if key != 'spbill_create_ip': if not isinstance(value, basestring): value = str(value) join_str_list.append('{k}={v}'.format(k=key, v=urllib.quote(value))) else: join_str_list.append('{k}={v}'.format(k=key, v=value.replace('.', '%2E'))) rep_xml = self._post( url='https://mch.tenpay.com/refundapi/gateway/refund.xml', data="&".join(join_str_list), verify=self.apiclient_ca_cert_path, cert=(self.apiclient_cert_path, self.apiclient_key_path), headers={"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"} ) notify = xml_json.parse(rep_xml).get("root", {}) old_sign = notify.get("sign") if not old_sign: return False, None sign_param = self.filter_params(**notify) new_sign = self.make_sign(sign_param=sign_param) if new_sign == old_sign: return True, notify else: return False, None
def verify_wx_callback_notify(self, notify_data): """ 解析与检验数据合法性 :param notify_data: 回调过来的数据 :rtype: bool :return: """ rep_dict = xml_json.parse(notify_data).get("xml", {}) old_sign = rep_dict.get("sign") if not old_sign: return False is_pass = self.check_signature(old_sign, rep_dict) return is_pass
def wap_pay(self, order_no, order_name, total_fee, user_open_id, notify_url, client_ip): """ 公众号支付 :param order_name: :param notify_url: :param order_no: :param client_ip: :param total_fee: :param user_open_id: 用户OPENID :return: """ if not user_open_id: raise ValueError(u"user_open_id not can is null.") nonce_str = self.gen_random_nonce_str() prepay_data = dict( appid=self.app_id, mch_id=self.__partner_id, nonce_str=nonce_str, body=order_name, out_trade_no=order_no, total_fee=total_fee, spbill_create_ip=client_ip, notify_url=notify_url, trade_type="JSAPI", device_info="WEB", openid=user_open_id ) sign_param = self.filter_params(**prepay_data) prepay_data["sign"] = self.make_sign(sign_param=sign_param) prepay_xml = xml_json.unparse({"xml": prepay_data}) rep_xml = self._post(url=self.pay_url_v3, data=prepay_xml.encode('utf-8')) rep_dict = xml_json.parse(rep_xml) prepay_id = rep_dict.get("xml", {}).get('prepay_id') now_time = int(time.time()) prepay = { 'timeStamp': now_time, 'nonceStr': nonce_str, 'appId': self.app_id, 'package': 'prepay_id={}'.format(prepay_id), 'signType': 'MD5' } filter_prepay = self.filter_params(**prepay) prepay['sign'] = self.make_sign(filter_prepay) return prepay
def app_pay_v3(self, order_no, order_name, total_fee, product_id, notify_url, client_ip): """ 微信app支付(第三版本) :param order_no: :param order_name: :param total_fee: 支付金额(分) :param product_id: 商品ID :param notify_url: :param client_ip: :return: """ if not product_id: raise ValueError(u"product_id not can null.") nonce_str = self.gen_random_nonce_str() prepay_data = dict( appid=self.app_id, mch_id=self.__partner_id, nonce_str=nonce_str, body=order_name, out_trade_no=order_no, total_fee=total_fee, spbill_create_ip=client_ip, notify_url=notify_url, trade_type="APP", product_id=product_id ) sign_param = self.filter_params(**prepay_data) prepay_data["sign"] = self.make_sign(sign_param=sign_param) prepay_xml = xml_json.unparse({"xml": prepay_data}) rep_xml = self._post(url=self.pay_url_v3, data=prepay_xml.encode('utf-8')) rep_dict = xml_json.parse(rep_xml) prepay_id = rep_dict.get("xml", {}).get('prepay_id') now_time = int(time.time()) prepay = { 'appid': self.app_id, 'prepayid': prepay_id, 'noncestr': nonce_str, 'timestamp': now_time, 'package': 'Sign=WXPay', 'partnerid': self.__partner_id } filter_prepay = self.filter_params(**prepay) prepay['sign'] = self.make_sign(filter_prepay) return prepay
def web_refund(self, trade_no, refund_no, order_no, total_fee, refund_fee): """ 公众号退款 :param trade_no: 交易流水号 :param refund_no: 退款单号 :param order_no: 订单号 :param total_fee: 交易总金额(分) :param refund_fee: 退款金额(分) :rtype: tuple :return: """ nonce_str = self.gen_random_nonce_str() prepay_data = dict( appid=self.app_id, mch_id=self.__partner_id, nonce_str=nonce_str, transaction_id=trade_no, out_trade_no=order_no, total_fee=total_fee, out_refund_no=refund_no, refund_fee=refund_fee, op_user_id=self.__partner_id ) sign_param = self.filter_params(**prepay_data) prepay_data["sign"] = self.make_sign(sign_param=sign_param) prepay_xml = xml_json.unparse({"xml": prepay_data}) rep_xml = self._post( url='https://api.mch.weixin.qq.com/secapi/pay/refund', data=prepay_xml.encode('utf-8'), cert=(self.apiclient_cert_path, self.apiclient_key_path) ) notify = xml_json.parse(rep_xml).get("xml", {}) old_sign = notify.get("sign") if not old_sign: return False, None sign_param = self.filter_params(**notify) new_sign = self.make_sign(sign_param=sign_param) if new_sign == old_sign: return True, notify else: return False, None
def parse_verify_web_notify(self, notify_data, sign): """ 解析与校对web支付回调数据 :param notify_data: :param sign: :return: """ notify_xml = self.decrypt_wap_pay(notify_data) if not notify_xml: return False, None para_str = 'service=alipay.wap.trade.create.direct&v=1.0&sec_id=0001' \ '¬ify_data={notify_data}'.format(notify_data=notify_xml) is_sign = self.verify_notify_sign(paras=para_str, sign=sign) if not is_sign: return False, None notify_dict = xml_json.parse(notify_xml).get("notify", {}) notify_id = notify_dict.get('notify_id') if notify_id: check_rep = self.verify_notify(notify_id) if check_rep: return True, notify_dict return False, None
def wap_pay(self, order_name, order_no, total_fee, notify_url, call_back_url, merchant_url): """ 网页支付方式 :param order_name: 订单名称 :param order_no: 订单号 :param total_fee: 金额(分) :param notify_url: 成功回调url :param call_back_url: 返回回调url :param merchant_url: :return: """ ali_pay_url = 'http://wappaygw.alipay.com/service/rest.htm' try: req_data = self.req_data_template.format( notify_url=notify_url, call_back_url=call_back_url, seller_account_name=self.seller_id, order_no=order_no, order_name=order_name, total_fee=float(total_fee) / 100, merchant_url=merchant_url ) params = dict( _input_charset='utf-8', service='alipay.wap.trade.create.direct', format='xml', v='2.0', partner=self.partner, req_id=order_no, sec_id='0001', req_data=req_data.encode('utf-8') ) sign_params = self.filter_params(**params) params['sign'] = self.make_wap_pay_sign(sign_params) param_data = urllib.urlencode(params) rep_data = self._get(url=ali_pay_url, params=param_data) url_info = urllib.unquote_plus(rep_data).split('&') res_json = {} for part in url_info: key, value = part.split('=', 1) res_json[key] = value res_data = self.decrypt_wap_pay(res_json.get('res_data')) parse_data = xml_json.parse(res_data) request_token = parse_data.get("direct_trade_create_res", {}).get("request_token", "") prepay_json = dict( req_data=self.request_token_template.format(request_token=request_token), service='alipay.wap.auth.authAndExecute', sec_id='0001', partner=self.partner, req_id=order_no, _input_charset='utf-8', format='xml', v='2.0' ) sign_param_str = self.filter_params(**prepay_json) prepay_json['sign'] = self.make_wap_pay_sign(sign_param_str) url = '{ali_pay_url}?{params}'.format( ali_pay_url=ali_pay_url, params=self.filter_params(quote=True, filter_sign=False, **prepay_json) ) return url except Exception, e: return ""