Ejemplo n.º 1
0
    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}
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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' \
                   '&notify_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
Ejemplo n.º 8
0
    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 ""