def pay_result_by_order_no(self, order_no, sign_type=1): """ 根据订单号查询支付结果 :param order_no: 本系统的订单号 :return: dict """ self._check_app_id() self._check_app_secret() params = dict(service_code='11', sp_no=self._app_id, order_no=order_no, output_type=1, output_charset=1, version=3, sign_method=1 ) sign = self.make_sign(sign_type, **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_dict_manager.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 refund_web(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: :return: """ nonce_str = self.__create_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 = self.make_sign(**prepay_data).upper() prepay_data["sign"] = sign xml_dict = {"xml": prepay_data} prepay_xml = xml_dict_manager.unparse(xml_dict) dir_path = os.getcwd() cert_file = dir_path + self.__ssl_cert_path key_file = dir_path + self.__ssh_key_path url = 'https://api.mch.weixin.qq.com/secapi/pay/refund' refund_logger_manager.logger.info(u"[WX Refund Input] url:{}, prepay_xml: {}".format( url, prepay_xml )) rep_xml = self._post( url=url, data=prepay_xml.encode('utf-8'), cert=(cert_file, key_file) ) refund_logger_manager.logger.info(u"[WX Refund Out] rep_xml: {}".format(rep_xml)) notify = xml_dict_manager.parse(rep_xml).get("xml", {}) old_sign = notify.get("sign") if not old_sign: return False, None sign_param = self.params_filter(**notify) sign_string = '{sign_param}&key={sign_key}'.format( sign_param=sign_param, sign_key=self.__partner_key) new_sign = self.encrypt_sign(sign_string).upper() if new_sign == old_sign: return True, notify else: return False, None
def parse_verify_web_notify(self, notify_data): """ 解析与检验数据合法性 :param notify_data: :return: """ rep_dict = xml_dict_manager.parse(notify_data).get("xml", {}) old_sign = rep_dict.get("sign") if not old_sign: return False, None is_pass = self.check_signature(old_sign, rep_dict) if is_pass: return True, rep_dict else: return False, None
def refund_app(self, trade_no, refund_no, order_no, total_fee, refund_fee): """ app 退款 :return: """ md5_pwd = self.encrypt_sign(self.__op_user_pwd).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 = self.make_sign(**prepay_data).upper() prepay_data["sign"] = sign req_params = self.get_request_body(**prepay_data) dir_path = os.getcwd() ca_cert_file = dir_path + self.__ssl_ca_cert_path cert_file = dir_path + self.__ssl_cert_path key_file = dir_path + self.__ssh_key_path rep_xml = self._post(url='https://mch.tenpay.com/refundapi/gateway/refund.xml', data=req_params, verify=ca_cert_file, cert=(cert_file, key_file), headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"} ) notify = xml_dict_manager.parse(rep_xml).get("root", {}) old_sign = notify.get("sign") if not old_sign: return False, None sign_param = self.params_filter(filter_sign_type=False, **notify) sign_string = '{sign_param}&key={sign_key}'.format( sign_param=sign_param, sign_key=self.__partner_key) new_sign = self.encrypt_sign(sign_string).upper() 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: :return: """ notify_xml = self.decrypt_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_dict_manager.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: """ current_app.logger.info( u"order prepay alipay wap pay input param, order_name: {}, order_no: {}, total_fee: {}, notify_url: {}, call_back_url:{}, merchant_url:{}".format( order_name, order_no, total_fee, notify_url, call_back_url, merchant_url)) try: req_data = self.req_data_template.format( notify_url=notify_url, call_back_url=call_back_url, seller_account_name=self._app_id, order_no=order_no, order_name=order_name, total_fee=str_fen_to_yuan(total_fee), merchant_url=merchant_url ) params = dict( _input_charset='utf-8', service='alipay.wap.trade.create.direct', format='xml', v='2.0', partner=self._app_secret, req_id=order_no, sec_id='0001', req_data=req_data.encode('utf-8') ) link_str = self.params_filter(**params) params['sign'] = self.make_pay_sign(link_str) ali_pay_url = 'http://wappaygw.alipay.com/service/rest.htm' param_data = urllib.urlencode(params) rep_data = self._get(url=ali_pay_url, params=param_data) res_json = self.parse_qs(urllib.unquote_plus(rep_data)) res_data = self.decrypt_pay(res_json.get('res_data')) request_token = xml_dict_manager.parse(res_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._app_secret, req_id=order_no, _input_charset='utf-8', format='xml', v='2.0' ) link_str = self.params_filter(**prepay_json) prepay_json['sign'] = self.make_pay_sign(link_str) url = '{ali_pay_url}?{params}'.format(ali_pay_url=ali_pay_url, params=self.params_filter(quote=True, filter_sign=False, **prepay_json ) ) except Exception, e: current_app.logger.info( u"order prepay alipay wap pay, error message:{}".format(e.message))
def wap_pay_v3(self, order_name, notify_url, order_no, client_ip, total_fee, user_open_id=None, trade_type=None, product_id=None): """ v3版本, 公众号支付 :param order_name: :param notify_url: :param order_no: :param client_ip: :param total_fee: :param user_open_id: :return: """ if trade_type == "APP" and not product_id: raise NeedParamError(u"product_id 参数不能为空。") if trade_type == "JSAPI" and not user_open_id: raise NeedParamError(u"user_open_id参数不能为空") nonce_str = self.__create_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=trade_type ) if trade_type == "APP": prepay_data["product_id"] = product_id elif trade_type == "JSAPI": prepay_data["device_info"] = "WEB" prepay_data["openid"] = user_open_id sign = self.make_sign(**prepay_data).upper() prepay_data["sign"] = sign xml_dict = {"xml": prepay_data} prepay_xml = xml_dict_manager.unparse(xml_dict) rep_xml = self._post(url=self.__uri_v3, data=prepay_xml.encode('utf-8')) rep_dict = xml_dict_manager.parse(rep_xml) prepay_id = rep_dict.get("xml", {}).get('prepay_id') now_time = int(time.time()) if trade_type == "APP": prepay = { 'appid': self._app_id, 'prepayid': prepay_id, 'noncestr': nonce_str, 'timestamp': now_time, 'package': 'Sign=WXPay', 'partnerid': self.__partner_id } else: prepay = {'timeStamp': now_time, 'nonceStr': nonce_str, 'appId': self._app_id, 'package': 'prepay_id={}'.format(prepay_id), 'signType': 'MD5' } sign = self.make_sign(**prepay).upper() prepay['sign'] = sign return prepay