def post(self, request, *args, **kwargs): try: package_id = request.POST.get('package_id') order = VIPOrder.create_order(request.user, int(package_id)) if order: log.info('****** order id: {} ******'.format(order.id)) order.pay_type = VIPOrder.PAY_TYPE_BY_ALIPAY_APP out_trade_no = create_trade_id(order.id) order.outtradeno = out_trade_no order.save() result = {'order_id': order.id} alipay_client_config = AlipayClientConfig() alipay_client_config.app_id = smart_str(settings.ALIPAY_APP_INFO['basic_info']['APP_ID']) alipay_client_config.sign_type = smart_str(settings.ALIPAY_APP_INFO['other_info']['SIGN_TYPE']) with open(settings.ALIPAY_APP_INFO['basic_info']['APP_PRIVATE_KEY'], 'r') as fp: alipay_client_config.app_private_key = fp.read() client = DefaultAlipayClient(alipay_client_config=alipay_client_config) model = AlipayTradeAppPayModel() model.total_amount = smart_str(str_to_specify_digits(str(order.price))) model.product_code = smart_str("QUICK_MSECURITY_PAY") model.body = smart_str(order.name) model.subject = smart_str(order.name) model.out_trade_no = smart_str(out_trade_no) model.passback_params = smart_str(settings.LMS_ROOT_URL + reverse("vip_purchase")) request = AlipayTradeAppPayRequest(biz_model=model) request.notify_url = smart_str(settings.ALIPAY_APP_INFO['other_info']['NOTIFY_URL']) result['alipay_request'] = client.sdk_execute(request) return Response(data=result) except Exception, e: log.exception(e)
def get_alipay_oauth_token_response(app_id, app_private_key, alipay_public_key, auth_code=''): ''' 初始化一个支付宝请求client ''' alipay_client_config = AlipayClientConfig() alipay_client_config.server_url = constants.SERVER_URL alipay_client_config.app_id = app_id alipay_client_config.app_private_key = app_private_key alipay_client_config.alipay_public_key = alipay_public_key alipay_client_config.format = 'json' alipay_client_config.charset = 'utf-8' alipay_client_config.sign_type = 'RSA2' client = DefaultAlipayClient(alipay_client_config=alipay_client_config) model = AlipaySystemOauthTokenModel() request = AlipaySystemOauthTokenRequest(biz_model=model) request.code = auth_code request.grant_type = 'authorization_code' response_content = None try: response_content = client.execute(request) except AopException: print(traceback.format_exc()) if not response_content: raise ValidationError({'app_id|app_private_key|alipay_public_key': ['all should be correct']}) res = AlipaySystemOauthTokenResponse() res.parse_response_content(response_content) return res
def alipay_query(cls, out_trade_no, trade_no, receipt, trade_type): '''alipay query''' try: config_dict = { VIPOrder.PAY_TYPE_BY_ALIPAY_APP: settings.ALIPAY_APP_INFO, VIPOrder.PAY_TYPE_BY_ALIPAY: settings.ALIPAY_APP_INFO, } config = config_dict[trade_type] alipay_client_config = AlipayClientConfig() alipay_client_config.app_id = smart_str(config['basic_info']['APP_ID']) alipay_client_config.sign_type = smart_str(config['other_info']['SIGN_TYPE']) with open(config['basic_info']['APP_PRIVATE_KEY'], 'r') as fp: alipay_client_config.app_private_key = fp.read() client = DefaultAlipayClient(alipay_client_config=alipay_client_config) model = AlipayTradeQueryModel() model.out_trade_no = smart_str(out_trade_no) if trade_no: model.trade_no = smart_str(trade_no) request = AlipayTradeQueryRequest(biz_model=model) request_params = client.sdk_execute(request) resp = requests.get('{}?{}'.format(SERVER_URL, request_params)).json() log.info('********** alipay query result ***********') log.info(resp) query_resp = resp['alipay_trade_query_response'] return { 'trade_status': query_resp.get('trade_status') == 'TRADE_SUCCESS', 'total_fee': float(query_resp.get('total_amount', 0)), 'refno': query_resp.get('trade_no', ''), } except Exception, e: log.exception(e)
def _set_config(self): " 设置配置项 " config = AlipayClientConfig() config.server_url = 'https://openapi.alipay.com/gateway.do' config.app_id = settings.ALIPAY['appid'] config.app_private_key = settings.ALIPAY['app_private_key'] config.alipay_public_key = settings.ALIPAY['alipay_public_key'] config.sign_type = 'RSA2' self.config = config
def get(self, request, *args, **kwargs): try: package_id = request.GET.get('package_id') order = VIPOrder.create_order(request.user, int(package_id)) if order: order.pay_type = VIPOrder.PAY_TYPE_BY_ALIPAY_APP out_trade_no = create_trade_id(order.id) order.outtradeno = out_trade_no order.save() result = {'order_id': order.id} alipay_client_config = AlipayClientConfig() alipay_client_config.app_id = smart_str( settings.ALIPAY_APP_INFO['basic_info']['APP_ID']) alipay_client_config.sign_type = smart_str( settings.ALIPAY_APP_INFO['other_info']['SIGN_TYPE']) with open( settings.ALIPAY_APP_INFO['basic_info'] ['APP_PRIVATE_KEY'], 'r') as fp: alipay_client_config.app_private_key = fp.read() client = DefaultAlipayClient( alipay_client_config=alipay_client_config) model = AlipayTradeWapPayModel() model.total_amount = smart_str( str_to_specify_digits(str(order.price))) model.product_code = smart_str("QUICK_WAP_WAY") model.subject = smart_str(_(order.name)) model.out_trade_no = smart_str(out_trade_no) # 返回页面时不使用缓存 quit_url = settings.LMS_ROOT_URL + reverse( "vip_alipay_h5_result") model.quit_url = smart_str(quit_url) model.passback_params = smart_str(settings.LMS_ROOT_URL + reverse("vip_purchase")) request = AlipayTradeWapPayRequest(biz_model=model) request.notify_url = smart_str( settings.ALIPAY_APP_INFO['other_info']['NOTIFY_URL']) result['alipay_request'] = client.sdk_execute(request) log.error(SERVER_URL + "?" + result['alipay_request']) data = { 'alipay_url': SERVER_URL + "?" + result['alipay_request'], 'order_id': order.id } return Response(xresult(data=data)) except Exception, e: log.exception(e)
def order_pay(order_id): """发起支付宝支付""" user_id = g.user_id # 判断订单状态 try: order = Order.query.filter(Order.id == order_id, Order.user_id == user_id, Order.status == "WAIT_PAYMENT").first() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="数据库异常") if order is None: return jsonify(errno=RET.NODATA, errms="订单数据有误") # todo: 业务处理 使用python的SDK 调用支付宝的支付接口 """ 设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。 """ alipay_client_config = AlipayClientConfig(sandbox_debug=True) alipay_client_config.server_url = 'https://openapi.alipaydev.com/gateway.do' alipay_client_config.app_id = '2016101900724693' # 应用id 这里是沙箱id alipay_client_config.charset = 'utf-8' with open( os.path.join(os.path.dirname(__file__), 'keys/app_private_key.txt')) as f: # 应用私钥 alipay_client_config.app_private_key = f.read() with open( os.path.join(os.path.dirname(__file__), 'keys/alipay_public_key.txt')) as f: # 支付宝公钥 alipay_client_config.alipay_public_key = f.read() alipay_client_config.sign_type = 'RSA2' # RSA或RSA2 """ 得到客户端对象。 注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后, alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。 logger参数用于打印日志,不传则不打印,建议传递。 """ client = DefaultAlipayClient(alipay_client_config=alipay_client_config) # 对照接口文档,构造请求对象 model = AlipayTradeWapPayModel() model.out_trade_no = order_id # 订单编号 model.total_amount = "%.2f" % (order.amount / 100.0) # 支付总金额 model.subject = "爱家租房 %s" % order.id # 订单标题 model.quit_url = "http://47.98.34.63:5000/orders.html" # 用户付款中途退出返回商户网站的地址 model.product_code = "QUICK_WAP_WAY" # 销售产品码,商家和支付宝签约的产品码 model.timeout_express = "30m" # 订单过期关闭时长(分钟) pay_request = AlipayTradeWapPayRequest(biz_model=model) # 通过模型创建请求对象 # get请求 用户支付成功后返回的页面请求地址 pay_request.return_url = "http://47.98.34.63:5000/payComplete.html" # post请求 用户支付成功后返回的页面请求地址 pay_request.notify_url = '' # 利用阿里支付对象发一个获取页面的请求 参数为order_string pay_url = client.page_execute(pay_request, http_method='GET') return jsonify(errno=RET.OK, errmsg="OK", data={"pay_url": pay_url})
import urllib.request ##need python3 logging.basicConfig(level=logging.INFO, filename='tornadoAliPay.log') logger = logging.getLogger('') #alipay public_key public_key = 'xxxxx' """ 设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。 """ #alipay_client_config = AlipayClientConfig() alipay_client_config = AlipayClientConfig() #alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do' alipay_client_config.app_id = 'xxxxx' alipay_client_config.app_private_key = 'xxxxxx' alipay_client_config.alipay_public_key = 'xxxxx' alipay_client_config.sign_type = 'RSA' """ 得到客户端对象。 注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。 logger参数用于打印日志,不传则不打印,建议传递。 """ client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger) url2 = "xxxxx" appID = "55" zoneID = "1" mcash = "1" platID = "888" moneyMap = {
from statuscode import TRADE_TYPE NOTIFY_URL = '' logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s', filemode='a',) LOGGER = logging.getLogger('') CLIENTCONFIG = AlipayClientConfig() CLIENTCONFIG.server_url = 'https://openapi.alipaydev.com/gateway.do' CLIENTCONFIG.app_id = '2016091700530462' CLIENTCONFIG.charset = 'utf-8' CLIENTCONFIG.sign_type = 'RSA2' CLIENTCONFIG.notify_url = NOTIFY_URL CLIENTCONFIG.app_private_key = ( 'MIIEogIBAAKCAQEAo9h9bEE9If52ENw4qp1VIfMTZ6vWldtbz/4XbXbYk+RAFhB+sTP7Y' '1OKryMpfkvcJwkRwF27zLSbpY8q78Udbpl+DiN1KtEeKIzqp6yaA+mwfoWytwAMyy73qX' 'yL1WThmne88w+jixI/aNyRr7eWM41LbIuuRzZvgxBeLQjLaCoaYPOJI7dhcMcrq25cDKJ' 'Z+i7afvin8/btT9gw8TZMTcRrRRCC9R2WpIkf/hgXrHaTczXmvoYLVwK1UQx41Z9jZfdg' 'QEeerKuYhIYCnSmlDWbhkGJ3mhdkoUUOEdOCD89SMyUiSw/TgHsvEyh5wlhF8Z+9lE9PO' '6apIeQFi2b6LQIDAQABAoIBAFZugdt1ntYr8gR657m5PYunOvlZgN2U1h4moB0ysJVztw' 'rssKiyD08aZvJ0zhK92ekNs7uSttsJ+4GewLuzdA9AEWtL8SchIZOqoq7JMoYV5PEZfml' 'jMVyN7kAOX4W2rfxaZeaivVdDzQd4M7JKWoXfZ4ZfORR/9ttg6w0+sm7DzwGAGsxEVyDB' 'tYER5UNjSPZeZIzS53FAUG40mhCDl+Ab/UWNSvAY44ITc6p29OdiLPwi8vpvdzL+AZtdw' '0B2dcsqq+H6tRyEuQwpH9SxrWCdiMWtiEsVyMl7PpI/FU0uDlSDTxFjwkesXhBXysh2rX' '0aHKcn1jiCljU/m1KxawECgYEA0IKUpuNZLgxIN3JYq/p6Tu15MMxLLzeoDw1m5n9qLGe' 'QUqwkHMQbfbcN/9sT8UwgHTq4VdM0F2bIqNx5bFuT6Kz1zVWe5e7k6JC8Z9d9Xxi1lkFT' '+CyGFriJHT8eS/wPm4sV+WT3NuC+FDoi0tnHVBDpZYrjf9Z3GD+DtosO9X0CgYEAySmzA'
def post(self, request): """查询支付结果""" # 校验用户是否登录' user = request.user if not user.is_authenticated: return JsonResponse({'res': 0, 'errmsg': '用户未登录'}) # 接收参数 order_id = request.POST.get('order_id') # 校验参数 if not order_id: return JsonResponse({'res': 1, 'errmsg': '无效的订单id'}) try: order = OrderInfo.objects.get(order_id=order_id, user=user, pay_method=3, order_status=1) except OrderInfo.DoesNotExist: return JsonResponse({'res': 2, 'errmsg': '订单错误'}) # todo: 业务处理 使用python的SDK 调用支付宝的支付接口 logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s', filemode='a', ) logger = logging.getLogger('') """ 设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。 """ alipay_client_config = AlipayClientConfig(sandbox_debug=True) alipay_client_config.server_url = 'https://openapi.alipaydev.com/gateway.do' alipay_client_config.app_id = '2016101900724693' # 应用id 这里是沙箱id alipay_client_config.charset = 'utf-8' with open( os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.txt')) as f: alipay_client_config.app_private_key = f.read() with open( os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.txt')) as f: alipay_client_config.alipay_public_key = f.read() alipay_client_config.sign_type = 'RSA2' # RSA或RSA2 """ 得到客户端对象。 注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后, alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。 logger参数用于打印日志,不传则不打印,建议传递。 """ client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger) while True: # 对照接口文档,构造请求对象 model = AlipayTradeQueryModel() model.out_trade_no = order_id query_request = AlipayTradeQueryRequest(biz_model=model) response = self.str_to_dict(client.execute(query_request)) """ response: { "code":"10000", # 接口调用是否成功 "msg":"Success", "buyer_logon_id":"mnd***@sandbox.com", "buyer_pay_amount":"0.00", "buyer_user_id":"2088102180300991", "buyer_user_type":"PRIVATE", "invoice_amount":"0.00", "out_trade_no":"2020010122413118", "point_amount":"0.00", "receipt_amount":"0.00", "total_amount":"39.90", "trade_no":"2020010422001400991000047401", # 支付宝交易号 "trade_status":"WAIT_BUYER_PAY" # 支付结果 } """ code = response.get('code') if code == '10000' and response.get( 'trade_status') == 'TRADE_SUCCESS': # 支付成功 # 获取支付宝交易号 trade_no = response.get('trade_no') # 更新订单状态 order.trade_no = trade_no order.order_status = 4 # 待评价 order.save() # 返回结果 return JsonResponse({'res': 3, 'message': '支付成功'}) elif code == '40004' or code == '10000' and response.get( 'trade_status') == 'WAIT_BUYER_PAY': # 等待买家付款 # 业务处理失败 可能一会会成功 time.sleep(5) continue else: # 支付出错 return JsonResponse({'res': 4, 'errmsg': '支付失败'})
def post(self, request): """订单支付""" # 校验用户是否登录' user = request.user if not user.is_authenticated: return JsonResponse({'res': 0, 'errmsg': '用户未登录'}) # 接收参数 order_id = request.POST.get('order_id') # 校验参数 if not order_id: return JsonResponse({'res': 1, 'errmsg': '无效的订单id'}) try: order = OrderInfo.objects.get(order_id=order_id, user=user, pay_method=3, order_status=1) except OrderInfo.DoesNotExist: return JsonResponse({'res': 2, 'errmsg': '订单错误'}) # todo: 业务处理 使用python的SDK 调用支付宝的支付接口 logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s', filemode='a', ) logger = logging.getLogger('') """ 设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。 """ alipay_client_config = AlipayClientConfig(sandbox_debug=True) alipay_client_config.server_url = 'https://openapi.alipaydev.com/gateway.do' alipay_client_config.app_id = '2016101900724693' # 应用id 这里是沙箱id alipay_client_config.charset = 'utf-8' with open( os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.txt')) as f: alipay_client_config.app_private_key = f.read() with open( os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.txt')) as f: alipay_client_config.alipay_public_key = f.read() alipay_client_config.sign_type = 'RSA2' # RSA或RSA2 """ 得到客户端对象。 注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后, alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。 logger参数用于打印日志,不传则不打印,建议传递。 """ client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger) # 计算商品金额 total_pay = order.total_price + order.transit_price # Decimal类型 # 订单内容:商品信息 alipay_body = '' goods = OrderGoods.objects.filter(order=order) for good in goods: alipay_body = alipay_body + good.sku.desc + ';' # 对照接口文档,构造请求对象 model = AlipayTradePayModel() model.out_trade_no = order_id # 订单id model.total_amount = str(total_pay) # 支付总金额 model.subject = '天天生鲜用户:%s,您正在支付[天天生鲜网站]订单号为%s' % ( user.username, order_id) # 订单标题 model.body = alipay_body model.product_code = 'FAST_INSTANT_TRADE_PAY' # 与支付宝签约的产品码名称,目前只支持这一种 model.timeout_express = '30m' # 订单过期关闭时长(分钟) pay_request = AlipayTradePagePayRequest(biz_model=model) # 通过模型创建请求对象 # get请求 用户支付成功后返回的页面请求地址 pay_request.return_url = '' # post请求 用户支付成功后返回的页面请求地址 pay_request.notify_url = '' # 利用阿里支付对象发一个获取页面的请求 参数为order_string pay_url = client.page_execute(pay_request, http_method='GET') # 返回应答 return JsonResponse({'res': 3, 'pay_url': pay_url})