def get(self, request, order_id): """查询要支付的订单,生成支付宝登录的链接""" user = request.user try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except OrderInfo.DoesNotExist: return http.HttpResponseForbidden('订单信息错误') # 创建支付宝支付对象 alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), sign_type="RSA2", # 必须与支付宝上加密方式一致 debug=settings.ALIPAY_DEBUG # True表示沙箱环境 ) # 生成支付宝登录网页链接 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), subject="Project_%s" % order_id, return_url=settings.ALIPAY_RETURN_URL, # 默认回调url app_notify_url=None, # 默认为None,必须是公网上线的域名 ) # 响应登录支付链接 # 真实环境电脑网站支付网关:https://openapi.alipay.com/gateway.do? + order_string # 沙箱环境电脑网站支付网关:https://openapi.alipaydev.com/gateway.do? + order_string alipay_url = settings.ALIPAY_URL + "?" + order_string return http.JsonResponse({ 'code': RETCODE.OK, 'errmsg': 'OK', 'alipay_url': alipay_url })
def get(self, request, order_id): """ 1.根据订单id查询订单 2.创建alipay实例对象 3.生成支付order_string 4.返回支付url """ user = request.user try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except OrderInfo.DoesNotExist: return http.HttpResponseBadRequest('订单信息错误') app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read() alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read() alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA 或者 RSA2 debug=False # 默认False ) order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), subject='测试订单', return_url=settings.ALIPAY_RETURN_URL, ) pay_url = settings.ALIPAY_URL + '?' + order_string return http.JsonResponse({ 'alipay_url': pay_url, 'code': RETCODE.OK, 'errmsg': 'ok' })
def get(self, request, order_id): # 对接支付宝支付逻辑 user = request.user try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except OrderInfo.DoesNotExist: return http.HttpResponseForbidden('订单信息错误') # 使用python-alipay-sdk对接支付宝的支付接口、功能 # 初始化对接支付宝的SDK实例 alipay = AliPay( appid=settings.ALIPAY_APPID, # 应用ID app_notify_url=None, # 默认回调url app_private_key_string=open( os.path.join(os.path.dirname(os.path.abspath(__file__)), 'keys/app_private_key.pem')).read(), alipay_public_key_string=open( os.path.join(os.path.dirname(os.path.abspath(__file__)), 'keys/alipay_public_key.pem')).read(), sign_type='RSA2', # 签名的标准 debug=settings.ALIPAY_DEBUG # 表示当前是调试环境 ) # 生成登录支付宝连接 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, # 美多商城维护的订单编号 total_amount=str(order.total_amount), # 支付金额 subject="美多商城%s" % order_id, # 订单的标题 return_url=settings.ALIPAY_RETURN_URL # 同步回调的地址(用来等待支付结果的) ) # 拼接电脑网站支付收银台登录页面的地址,正式环境,需要跳转到https://openapi.alipay.com/gateway.do? + order_string # 拼接电脑网站支付收银台登录页面的地址,开发环境,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string alipay_url = settings.ALIPAY_URL + '?' + order_string return http.JsonResponse({ 'code': RETCODE.OK, 'errmsg': 'OK', 'alipay_url': alipay_url })
def get(self, request, order_id): """生成支付宝支付url""" # 获取当前请求用户 user = request.user # 1.校验订单 try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except OrderInfo.DoesNotExist: return Response({'message': '订单有误'}, status=status.HTTP_400_BAD_REQUEST) # 2.创建支付宝对象 alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), 'keys/app_private_key.pem'), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), 'keys/alipy_public_key.pem'), sign_type='RSA2', debug=settings.ALIPAY_DEBUG) # 3.生成支付url后面的参数 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), subject='美多商城:%s' % order_id, return_url='http://www.meiduo.site:8080/pay_success.html', ) # 4.拼接url + 参数 alipay_url = settings.ALIPAY_URL + "?" + order_string # 5.响应支付url return Response({'alipay_url': alipay_url})
def order_pay(request): ''' 订单支付 orderId:订单ID ''' order_id = request.POST.get('orderId') if not order_id: return JsonResponse({'status': '401', 'errmsg': '无效的订单编号!'}) try: order = Order.objects.get(user=request.user, order_id=order_id, pay_method=2, order_status=1) except: return JsonResponse({'status': '401', 'errmsg': '订单错误!'}) app_private_key_string = open(settings.PRIVATE_KEY).read() alipay_public_key_string = open(settings.PUBLIC_KEY).read() alipay = AliPay( appid="2021000116676798", # 沙箱环境里的appid app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False ) # 如果你是 Python 3的用户,使用默认的字符串即可 subject = "测试订单" + str(order_id) # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.goods_total), subject=subject, return_url=None, notify_url=None, # 可选, 不填则使用默认notify url ) # 支付宝网关 url = 'https://openapi.alipaydev.com/gateway.do?' path = url + order_string return JsonResponse({'status': '200', 'pay_path': path})
class MyAliPay(View): #自定义视图类的基类 def __init__(self, **kwargs): super().__init__(**kwargs) self.alipay = AliPay( appid= settings.ALIPAY_APP_ID, app_notify_url=None, #应用私钥 app_private_key_string= app_private_key_string, #支付宝公钥 alipay_public_key_string= alipay_public_key_string, #指明签名算法 sign_type="RSA2", #debug模式 会把请求发送至沙箱环境 debug=True ) def get_trade_url(self, order_id, amount): #pc网站支付地址 https://openapi.alipaydev.com/gateway.do? + querystring order_string = self.alipay.api_alipay_trade_page_pay( #订单号 out_trade_no=order_id, #订单总金额 total_amount= amount, subject=order_id, return_url=settings.ALIPAY_RETURN_URL, notify_url= settings.ALIPAY_NOTIFY_URL ) return "https://openapi.alipaydev.com/gateway.do?" + order_string def get_verify_result(self, data, sign): #验签成功 返回 True 失败是 False return self.alipay.verify(data, sign) def get_trade_result(self, order_id): #查询支付结果 result = self.alipay.api_alipay_trade_query(out_trade_no=order_id) print(result) if result.get("trade_status") == "TRADE_SUCCESS": return True return False
def post(self, request, *args, **kwargs): order_id = request.data.get("order_id") pay_channel = request.data.get("pay_channel") order = CinemaMovieOrder.objects.get(pk=order_id) o_price = order.c_price order_id = "cinema_movie" + order_id if pay_channel == "alipay": subject = "电脑" alipay = AliPay( appid=APP_ID, app_notify_url=None, app_private_key_string=APP_PRIVATE_KEY, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=ALIPAY_PUBLIC_KEY, sign_type="RSA", debug=True # 默认False ) order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=o_price, subject=subject, return_url="http://localhost:8000/cinema/orderpayed/", notify_url= "http://localhost:8000/cinema/orderpayconfirm/" # 可选, 不填则使用默认notify url ) pay_info = "https://openapi.alipaydev.com/gateway.do?" + order_string elif pay_channel == "wechat": pay_info = "xxx" else: pay_info = "yyy" data = {"msg": "ok", "status": 200, "pay_url": pay_info} return Response(data)
def post(self, request): user = request.user if not user.is_authenticated(): return JsonResponse({'res': 0, 'errmsg': '用户尚未登录!'}) order_id = request.POST.get('orderId') if order_id is None: return JsonResponse({'res': 1, 'errmsg': '尚未选择需要支付的订单!'}) try: order = OrderInfo.objects.get( order_id=order_id, user=user, order_status=1, # 订单尚未支付 pay_method=3 # 支付方式为支付宝 ) except OrderInfo.DoesNotExist: return JsonResponse({'res': 2, 'errmsg': '订单信息不合法!'}) app_private_key_string = open( os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem')).read() alipay_public_key_string = open( os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem')).read() alipay = AliPay( appid="2016092700606291", app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA 或者 RSA2(支付宝推荐) debug=True # 默认False,沙箱环境应设为True ) # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_price + order.transit_price), subject='天天生鲜在线支付:' + order_id, return_url=None, notify_url=None # 可选, 不填则使用默认notify url ) # 返回应答 pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string return JsonResponse({'res': 'OK', 'pay_url': pay_url})
def get(self, request, order_id): user = request.user try: order_id = int(order_id) pay_for_order = OrderInfo.objects.get( order_id=order_id, user=user, pay_method=OrderInfo.PAY_METHODS_ENUM['ALIPAY'], status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except Exception: return Response({'error_message': '订单信息有误'}, status=status.HTTP_400_BAD_REQUEST) # 对目标order进行支付请求操作; total_payment = float(pay_for_order.total_amount + pay_for_order.freight) alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=settings.ALIPAY_DEBUG # 默认False ) subject = '美多商城' query_params = alipay.api_alipay_trade_page_pay( subject, order_id, total_payment, return_url="http://www.meiduo.site:8080/pay_success.html", notify_url=None) alipay_url = settings.ALIPAY_URL + '?' + query_params return Response({'alipay_url': alipay_url})
def ali_buy(request): # order_no = "2019082102983" alipay = AliPay( appid=ALI_APP_ID, app_notify_url=None, # 默认回调url app_private_key_string=APP_PRIVATE_KEY, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=ALIPAY_PUBLIC_KEY, sign_type="RSA2", # RSA 或者 RSA2 debug=False # 默认False ) # trade_no = datetime.now().strftime("%Y%m%d%H%M%S%f") jine = int( sum([ i.products.first().price * i.productnum for i in Order.objects.filter(order_status=1, user_id=request.user.uid) ])) - request.user.score / 10 trade_no = Order.objects.filter(user_id=request.user.uid).first().id print(trade_no) order_string = alipay.api_alipay_trade_page_pay( out_trade_no=trade_no, # 订单号 total_amount=jine, # 金额 subject="macpro", # 描述 return_url="http://127.0.0.1:8000/app/", # notify_url="http://online.xiaohaitao.wang/callback/" # 可选, 不填则使用默认notify url ) print(request.POST.get('money')) # print(order_string) # 支付宝网关 net = "https://openapi.alipaydev.com/gateway.do?" order = Order.objects.filter(user_id=request.user.uid) for i in order: print(11111) i.order_status = 2 i.save() return redirect(net + order_string)
def get(self, request, order_id): ''' 发起支付 :param request: :param order_id: 前端传来的订单id :return: ''' user = request.user # 校验订单号 try: order = OrderInfo.objects.get( order_id=order_id, user=user, pay_method=OrderInfo.PAY_METHODS_ENUM['ALIPAY'], status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except OrderInfo.DoesNotExist: return Response({'message': '订单信息有误'}, status=status.HTTP_400_BAD_REQUEST) # 生成网站链接支付宝的客户端 alipay_client = AliPay( appid=settings.ALIPAY_APPID, # 网站的id app_notify_url=None, # 默认回调url app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 加密方式 debug=settings.ALIPAY_DEBUG # 默认False, 沙箱环境 ) # 根据客户端调用接口,来生成交易的流水号, 3456789 order_string = alipay_client.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), subject="美多商城%s" % order_id, return_url="http://www.meiduo.site:8080/pay_success.html", ) # 拼接链接,返回给用户,让用户去登录 alipay_url = settings.ALIPAY_URL + "?" + order_string return Response({'alipay_url': alipay_url})
def get(self, request, order_id): user = request.user try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"], pay_method=OrderInfo.PAY_METHODS_ENUM["ALIPAY"]) except OrderInfo.DoesNotExist: return Response({"message": "订单信息有误"}, status=status.HTTP_400_BAD_REQUEST) # 向支付宝发送请求,获取支付链接参数 alipay_client = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 阿里服务器post提交程序服务器告知支付信息 app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是自己的公钥 alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), sign_type="RSA2", # RSA or RSA2 # True为沙箱环境 debug=settings.ALIPAY_DEBUG # False by default ) # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay_client.api_alipay_trade_page_pay( out_trade_no=order_id, # 订单编号 total_amount=str(order.total_amount), # 总金额 subject="美多商城订单%s" % order_id, # 订单标题 return_url= "http://www.meiduo.site:8080/pay_success.html", # 支付完成后回调网址 notify_url=None # 可选, 不填则使用默认notify url ) # 拼接支付链接网址 alipay_url = settings.ALIPAY_URL + "?" + order_string return Response({"alipay_url": alipay_url})
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, errmsg="订单数据有误") app_private_key_path = open(os.path.join(os.path.dirname(__file__), "key/app_private_key.pem")).read() # 私钥 alipay_public_key_path = open(os.path.join(os.path.dirname(__file__), "key/alipay_public_key.pem")).read() # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, print(app_private_key_path) # 创建支付宝sdk的工具对象 alipay_client = AliPay( appid="2016081600258081", app_notify_url=None, # 默认回调url app_private_key_path=app_private_key_path, # 私钥 alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=False, # 默认False ) # 手机网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string # api_alipay_trade_wap_pay order_string = alipay_client.api_alipay_trade_page_pay( out_trade_no=5, # order.id, # 订单编号 total_amount=str(100 / 100.0), # 总金额 subject=u"爱家租房 %s", # % order.id, # 订单标题 return_url="http://127.0.0.1:5000/payComplete.html", # 返回的连接地址 notify_url=None # 可选, 不填则使用默认notify url ) # 构建让用户跳转的支付连接地址 pay_url = constants.ALIPAY_URL_PREFIX + order_string return jsonify(errno=RET.OK, errmsg="OK", data={"pay_url": pay_url})
def get(self, request, order_id): # 查询要支付的订单 user = request.user try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except Exception as e: return JsonResponse({'code': 400, 'errmsg': 'order_id有误'}) # 创建支付宝支付对象 alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), sign_type="RSA2", debug=settings.ALIPAY_DEBUG) # 生成登录支付宝连接 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), subject="美多商城%s" % order_id, return_url=settings.ALIPAY_RETURN_URL, ) # 响应登录支付宝连接 # 真实环境电脑网站支付网关:https://openapi.alipay.com/gateway.do? + order_string # 沙箱环境电脑网站支付网关:https://openapi.alipaydev.com/gateway.do? + order_string alipay_url = settings.ALIPAY_URL + "?" + order_string return JsonResponse({ 'code': 0, 'errmsg': 'OK', 'alipay_url': alipay_url })
def post(self, request): if not request.user.is_authenticated(): return JsonResponse({'res': 0, 'errmssg': '请先登录'}) 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=request.user, pay_method=3, order_status=1) except OrderInfo.DoesNotExist: return JsonResponse({'res': 2, 'errmsg': '订单错误'}) # 初始化 # 配置地址 private_path = os.path.join(settings.BASE_DIR, 'order/app_private_key.pem') public_path = os.path.join(settings.BASE_DIR, 'order/alipay_public_key.pem') # 获取公私钥字符串 app_private_key_string = open(private_path).read() alipay_public_key_string = open(public_path).read() alipay = AliPay( appid='2016101900720150', app_notify_url=None, app_private_key_string=app_private_key_string, alipay_public_key_string=alipay_public_key_string, sign_type='RSA2', debug=True ) # 调用支付接口 total_pay = order.total_price+order.transit_price order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(total_pay), #支付总金额 subject='天天生鲜%s'%order_id, return_url=None, notify_url=None ) pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url})
def get(self, request): """获取支付宝的链接""" order_number = request.query_params.get('order_number') app_private_key_path = settings.ALIAPY_CONFIG['app_private_key_path'] alipay_public_key_string = settings.ALIAPY_CONFIG['alipay_public_key_path'] print(app_private_key_path) print(alipay_public_key_string) try: # 查询当前的订单是否存在 order = Order.objects.get(order_number=order_number) except Order.DoesNotExist: return Response({'message': '对不起,当前的订单不存在'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) # 初始化支付宝所需的参数 alipay = AliPay( appid=settings.ALIAPY_CONFIG['appid'], # 沙箱应用的id app_notify_url=settings.ALIAPY_CONFIG['app_notify_url'], # 默认回调url # 开发者私钥 app_private_key_string=settings.ALIAPY_CONFIG['app_private_key_path'], # app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=settings.ALIAPY_CONFIG['alipay_public_key_path'], # alipay_public_key_string=alipay_public_key_string, sign_type=settings.ALIAPY_CONFIG['sign_type'], # RSA 或者 RSA2 debug=settings.ALIAPY_CONFIG['debug'], # 默认False ) # 电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( # 支付宝所接受的订单号 out_trade_no=order.order_number, # 总价 total_amount=float(order.real_price), subject=order.order_title, return_url=settings.ALIAPY_CONFIG['return_url'], notify_url=settings.ALIAPY_CONFIG['notify_url'], # 可选, 不填则使用默认notify url ) url = settings.ALIAPY_CONFIG['gateway_url'] + order_string return Response(url)
def order_pay(request): '''订单支付''' # 用户登录判断 if not request.session.has_key('islogin'): return JsonResponse({'res': 0, 'errmsg': '用户未登录'}) # 接收订单id order_id = request.POST.get('order_id') # 数据校验 if not order_id: return JsonResponse({'res': 1, 'errmsg': '订单不存在'}) try: order = OrderInfo.objects.get(order_id=order_id, status=1, pay_method=3) except OrderInfo.DoesNotExist: return JsonResponse({'res': 2, 'errmsg': '订单信息出错'}) # 和支付宝进行交互 alipay = AliPay( appid="2016090800464054",# 应用id app_notify_url=None, # 默认回调url app_private_key_path=os.path.join(settings.BASE_DIR, 'order/app_private_key.pem'), alipay_public_key_path=os.path.join(settings.BASE_DIR, 'order/alipay_public_key.pem'), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True, # 默认False ) # 电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string total_pay = order.total_price + order.transit_price # decimal order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, # 订单id total_amount=str(total_pay), subject='尚硅谷书城%s' % order_id, return_url=None, notify_url=None # 可选, 不填则使用默认notify url ) # 返回应答 pay_url = settings.ALIPAY_URL + '?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url, 'message': 'OK'})
def get(self, request): """生成支付宝的支付链接地址""" # 获取订单号 有订单才可去支付 order_number = request.query_params.get("order_number") print(order_number) # 查询订单是否存在 try: order = Order.objects.get(order_number=order_number) except Order.DoesNotExist: return Response({"message": "对不起,您支付的订单不存在"}, status=status.HTTP_400_BAD_REQUEST) # 初始化支付宝参数 alipay = AliPay( appid=settings.ALIAPY_CONFIG['appid'], # 沙箱支付id app_notify_url=settings. ALIAPY_CONFIG["app_notify_url"], # the default notify path # 应用私钥 app_private_key_string=settings. ALIAPY_CONFIG['app_private_key_path'], # 支付宝公钥 alipay_public_key_string=settings. ALIAPY_CONFIG['alipay_public_key_path'], sign_type=settings.ALIAPY_CONFIG['sign_type'], # RSA or RSA2 debug=settings.ALIAPY_CONFIG['debug'], # False by default ) # TODO 电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order.order_number, total_amount=float(order.real_price), subject=order.order_title, return_url=settings.ALIAPY_CONFIG['return_url'], notify_url=settings. ALIAPY_CONFIG['notify_url'], # 可选, 不填则使用默认notify url ) # 生成好的支付地址需要将order_string 与网关拼接起来才可以访问 url = settings.ALIAPY_CONFIG['gateway_url'] + order_string return Response(url)
def get(self, request, order_id): # 1.校验参数 判断 order 是否存在 user = request.user try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except Exception as e: return HttpResponseForbidden('订单不存在') # 2. 创建 alipay对象 链接支付宝 from alipay import AliPay alipy = AliPay(appid=settings.ALIPAY_APPID, app_notify_url=None, app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), sign_type="RSA2", debug=settings.ALIPAY_DEBUG) # 3. 根据alipay对象, 加密参数 order_string = alipy.api_alipay_trade_page_pay( subject="美多商城%s" % order_id, out_trade_no=order_id, total_amount=str(order.total_amount), return_url=settings.ALIPAY_RETURN_URL) # 4.拼接 支付宝的支付url 返回给前端 # 真实环境电脑网站支付网关:https://openapi.alipay.com/gateway.do? + order_string # 沙箱环境电脑网站支付网关:https://openapi.alipaydev.com/gateway.do? + order_string alipay_url = settings.ALIPAY_URL + "?" + order_string return JsonResponse({ 'code': RETCODE.OK, 'errmsg': 'OK', 'alipay_url': alipay_url })
def get(self,request,order_id): # ①获取订单id try: # 为了让查询更准确 order=OrderInfo.objects.get(order_id=order_id, user=request.user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except OrderInfo.DoesNotExist: return JsonResponse({'code':RETCODE.NODATAERR,'errmsg':'没有此订单'}) # ②创建alipay实例对象 from alipay import AliPay from meiduo_mall import settings #读取私钥和公钥 app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read() alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read() alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA 或者 RSA2 debug = settings.ALIPAY_DEBUG # 默认False ) # ③调用电脑网站支付方法,生成order_string subject = "测试订单" # 线上 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), # decimal subject=subject, return_url=settings.ALIPAY_RETURN_URL, #notify_url="https://example.com/notify" # 可选, 不填则使用默认notify url ) # ④拼接url alipay_url=settings.ALIPAY_URL + '?' + order_string # ⑤返回相应 支付的url return JsonResponse({'code':RETCODE.OK,'errmsg':'ok','alipay_url':alipay_url})
def get(self, request, order_id): # 1. 验证Order_id try: order = OrderInfo.objects.get(order_id=order_id, user=request.user, status=1) except Exception as e: return JsonResponse({"code": 400, "errmsg": 'order_id有误'}) # 2. 调用Python-alipay-sdk工具类, 创建一个对象 alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), sign_type="RSA2", debug=settings.ALIPAY_DEBUG) # 3. 调用对象的方法 ====> 拼接好的字符串 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), subject="美多商城%s" % order_id, return_url=settings.ALIPAY_RETURN_URL, ) # 4. 把支付宝的网关(url) + 字符串 ====> 完整的url地址 # 响应登录支付宝连接 # 真实环境电脑网站支付网关:https://openapi.alipay.com/gateway.do? + order_string # 沙箱环境电脑网站支付网关:https://openapi.alipaydev.com/gateway.do? + order_string alipay_url = settings.ALIPAY_URL + "?" + order_string return JsonResponse({ 'code': 0, 'errmsg': 'OK', 'alipay_url': alipay_url })
def order_pay(request): order_id = request.POST.get('order_id') if not order_id: return JsonResponse({'res': 1, 'errmsg': '订单不存在'}) try: order = OrderInfo.objects.get(order_id=order_id, status=1, pay_method=3) except OrderInfo.DoesNotExist: return JsonResponse({'res': 2, 'errmsg': '订单信息出错'}) app_private_key_path = os.path.join(settings.BASE_DIR, 'order/app_private_key.txt') alipay_public_key_path = os.path.join(settings.BASE_DIR, 'order/app_public_key.txt') app_private_key_string = open(app_private_key_path).read() alipay_public_key_string = open(alipay_public_key_path).read() alipay = AliPay( appid="2016092000554906", # 应用id app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, alipay_public_key_string= alipay_public_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True, # 默认False ) # 电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string total_pay = order.total_price + order.transit_price # decimal order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, # 订单id total_amount=str(total_pay), # Json传递,需要将浮点转换为字符串 subject='尚硅谷书城%s' % order_id, return_url=None, notify_url=None # 可选, 不填则使用默认notify url ) # 返回应答 pay_url = settings.ALIPAY_URL + '?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url, 'message': 'OK'})
def post(self, request): # 接收order_id order_id = request.POST.get('order_id') # 校验参数 if not order_id: return JsonResponse({'code': 2, 'message': 'order_id错误'}) # 查询:需要查询出订单信息,将来交给支付宝 try: # id正确,user正确,待支付,支付方式是支付宝 order = OrderInfo.objects.get(order_id=order_id, user=request.user, status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"], pay_method=OrderInfo.PAY_METHODS_ENUM["ALIPAY"]) except OrderInfo.DoesNotExist: return JsonResponse({'code': 3, 'message': '订单不存在'}) # 对接到支付宝 # 创建用于支付宝支付的对象 alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/orders/app_private_key.pem'), alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/orders/alipay_public_key.pem'), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False 配合沙箱模式使用,沙箱模式写True ) # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), # 将浮点数转成字符串 subject='天天生鲜', return_url=None, notify_url=None # 可选, 不填则使用默认notify url ) # 拼接访问支付宝的请求地址 url = settings.ALIPAY_URL + '?' + order_string return JsonResponse({'code': 0, 'message': '支付成功', 'url': url})
def get(self, request, *args, **kwargs): order_number = request.query_params.get('order_number') # TODO 查询订单是否存在 try: order = Order.objects.get(order_number=order_number) except Order.DoesNotExist: return Response({'message': '订单不存在'}, status=status.HTTP_400_BAD_REQUEST) # TODO 初始化支付宝参数 alipay = AliPay( appid=settings.ALIPAY_CONFIG['appid'], # 沙箱应用的id app_notify_url=settings.ALIPAY_CONFIG['app_notify_url'], # 默认回调url # k开发者私钥 app_private_key_string=settings. ALIPAY_CONFIG['app_private_key_path'], # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=settings. ALIPAY_CONFIG['alipay_public_key_path'], sign_type=settings.ALIPAY_CONFIG['sign_type'], # RSA 或者 RSA2 debug=settings.ALIPAY_CONFIG['debug'], # 默认False ) # TODO 电脑网站支付 alipay.trade.page.pay # 这是订单信息. order_string = alipay.api_alipay_trade_page_pay( # 支付宝所接受的订单号 out_trade_no=order.order_number, # 总价 total_amount=float(order.real_price), subject=order.order_title, return_url=settings.ALIPAY_CONFIG['return_url'], notify_url=settings. ALIPAY_CONFIG['notify_url'], # 可选, 不填则使用默认notify url ) # TODO 生成订单信息 需要将订单信息(order_string)和网关(沙箱地址)拼接 url = settings.ALIPAY_CONFIG['gateway_url'] + order_string return Response(url)
def get(self, request, order_id): user = request.user # order_id # 校验 try: order = OrderInfo.objects.get( order_id=order_id, user=user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'], pay_method=OrderInfo.PAY_METHODS_ENUM['ALIPAY']) except OrderInfo.DoesNotExist: return Response({'message': '订单信息有误'}, status=status.HTTP_400_BAD_REQUEST) # 向支付宝发起请求,获取支付链接参数 alipay_client = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join( os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=settings.ALIPAY_DEBUG # 默认False 是否是沙箱环境 ) # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay_client.api_alipay_trade_page_pay( out_trade_no=order_id, # 订单编号 total_amount=str(order.total_amount), # 总金额 subject='美多商城订单%s' % order_id, return_url="http://www.meiduo.site:8080/pay_success.html", notify_url=None # 可选, 不填则使用默认notify url ) # 拼接支付链接网址 alipay_url = settings.ALIPAY_URL + '?' + order_string # 返回 return Response({'alipay_url': alipay_url})
def get(self, request, order_id): try: order = OrderInfo.objects.get( order_id=order_id, user=request.user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']) except: return JsonResponse({"code": 5555, "errmsg": "订单不存在"}) from alipay import AliPay app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read() alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read() alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA 或者 RSA2 debug=settings.ALIPAY_DEBUG # 默认False ) # 如果你是 Python 3的用户,使用默认的字符串即可 subject = "测试订单" # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(order.total_amount), subject=subject, return_url=settings.ALIPAY_RETURN_URL, # notify_url="https://example.com/notify" # 可选, 不填则使用默认notify url ) alipay_url = settings.ALIPAY_URL + '?' + order_string return JsonResponse({ "code": 0, "errmsg": "ok", "alipay_url": alipay_url })
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 as e: return JsonResponse({'res': 2, 'errmsg': '订单错误'}) # 调用支付宝接口 alipay = AliPay(appid="2016101400683195", app_notify_url=None, app_private_key_string=open( 'apps/order/app_private_key.pem').read(), alipay_public_key_string=open( 'apps/order/alipay_public_key.pem').read(), sign_type="RSA2", debug=True) # 电脑网站支付 需要跳转到https://openapi.alipay.com/gateway.do? + order_string total_pay = order.total_price + order.transit_price order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, total_amount=str(total_pay), subject='天天生鲜%s' % order_id, return_url="https://example.com", notify_url="https://example.com/notify") # 返回应答,引导html页面跳转去接受支付的页面 pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url})
def ali_pay(request): order_num = request.GET.get('order_num') total_fee = request.GET.get('total_fee') subject = request.GET.get('subject') # 实例化支付 ali_pay = AliPay(appid="2016101200667842", app_notify_url=None, alipay_public_key_string=ALIPAY_PUBLIC, app_private_key_string=APP_PRIVATE, sign_type="RSA2") # 实例化订单 order_string = ali_pay.api_alipay_trade_page_pay( out_trade_no=order_num, total_amount=str(total_fee), subject=subject, return_url='http://127.0.0.1:8000/buyer/payinfo/', notify_url=None) ret = ALIPAY_URL + '?' + order_string return redirect(ret)
def AliPayViews(request): alipay_id = request.GET.get("alipay_id") order_total_price = request.GET.get("order_total_price") #实例化支付 alipay = AliPay(appid="2016101200667752", app_notify_url=None, app_private_key_string=alipay_private_key_string, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2") # 实例化订单 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=alipay_id, total_amount=str(order_total_price), subject="商品交易", return_url='http://10.10.14.182/shop/pay_result/', notify_url='http://10.10.14.182/shop/pay_result/') #网页支付订单 #拼接收款地址 = 支付宝网关 + 订单返回参数 result = "https://openapi.alipaydev.com/gateway.do?" + order_string return HttpResponseRedirect(result)
def AlipayViews(request): order_number = request.GET.get("order_number") order_total = request.GET.get("total") #实例化支付 alipay = AliPay(appid="2016101200667858", app_notify_url=None, app_private_key_string=alipay_private_key_string, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2") #订单实例化 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_number, total_amount=str(order_total), subject="中公教育", return_url="http://127.0.0.1:8000/Buyer/payresult/", #结果返回的地址 notify_url="http://127.0.0.1:8000/Buyer/payresult/" #订单状态发生改变后返回的地址 ) #网页支付订单 #拼接收款地址 = 支付宝网关 + 订单返回参数 result = "https://openapi.alipaydev.com/gateway.do?" + order_string return HttpResponseRedirect(result)