Esempio n. 1
0
    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}
Esempio n. 2
0
    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
Esempio n. 3
0
 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
Esempio n. 4
0
    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
Esempio n. 5
0
    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' \
                   '&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_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
Esempio n. 6
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:
        """
        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))
Esempio n. 7
0
    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