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 get_url_request(): app_alipay_sanbox_private_path = r'C:\Users\jerry\Desktop\app_private_key.pem' alipay_sanbox_public_path = r'C:\Users\jerry\Desktop\alipay_public_key.pem' alipay_client_config = AlipayClientConfig() alipay_client_config.server_url = "https://openapi.alipaydev.com/gateway.do" alipay_client_config.app_id = "20160923420591565" alipay_client_config.app_private_key = get_key( app_alipay_sanbox_private_path) alipay_client_config.alipay_public_key = get_key(alipay_sanbox_public_path) alipay_client_config.charset = 'utf-8' client = DefaultAlipayClient(alipay_client_config=alipay_client_config) model = AlipayTradePagePayModel() model.out_trade_no = "pay201805020000227" model.total_amount = 50 model.subject = "test" model.body = "alipaytest" model.product_code = "FAST_INSTANT_TRADE_PAY" # settle_detail_info = SettleDetailInfo() # settle_detail_info.amount = 50 # settle_detail_info.trans_in_type = "userId" # settle_detail_info.trans_in = "2088302300165605" # # settle_detail_infos = list() # settle_detail_infos.append(settle_detail_info) # # settle_info = SettleInfo() # settle_info.settle_detail_infos = settle_detail_infos # # model.settle_info = settle_info # # # sub_merchant = SubMerchant() # sub_merchant.merchant_id = "208830234153246" # # model.sub_merchant = sub_merchant request = AlipayTradePagePayRequest(biz_model=model) response = client.page_execute(request, http_method="GET") return response
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})
response = client.page_execute(request, http_method="GET") return response if __name__ == "__main__": app_alipay_sanbox_private_path = r'C:\Users\jerry\Desktop\app_private_key.pem' alipay_sanbox_public_path = r'C:\Users\jerry\Desktop\alipay_public_key.pem' alipay_client_config = AlipayClientConfig() alipay_client_config.server_url = "https://openapi.alipaydev.com/gateway.do" alipay_client_config.app_id = "201609234200591565" alipay_client_config.app_private_key = get_key( app_alipay_sanbox_private_path) alipay_client_config.alipay_public_key = get_key(alipay_sanbox_public_path) alipay_client_config.charset = 'utf-8' client = DefaultAlipayClient(alipay_client_config=alipay_client_config) model = AlipayTradePagePayModel() model.out_trade_no = "pay20180452320000227" model.total_amount = 50 model.subject = "test" model.body = "alipaytest" model.product_code = "FAST_INSTANT_TRADE_PAY" # settle_detail_info = SettleDetailInfo() # settle_detail_info.amount = 50 # settle_detail_info.trans_in_type = "userId" # settle_detail_info.trans_in = "2088323400165605" #
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'
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})