def get(self, request): # 获取所有的查询字符串参数 query_dict = request.GET # 将查询字符串参数的类型转成标准的字典类型 data = query_dict.dict() # 从查询字符串参数中提取并移除 sign ,不能参与签名验证 signature = data.pop('sign') # 创建对接支付宝接口的SDK对象 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", # 加密方式 debug=settings.ALIPAY_DEBUG # 指定是否为开发环境 ) # 使用SDK对象,调用通知验证接口函数,得到验证结果 success = alipay.verify(data=data, signature=signature) # 如果验证通过,需要将支付宝的支付状态进行处理(将美多商城的订单ID和支付宝订单ID绑定,修改订单状态) if success: # 订单绑定 # 美多商城订单id order_id = data.get('out_trade_no') # 支付宝订单id trade_id = data.get('trade_no') Payment.objects.create(order_id=order_id, trade_id=trade_id) # 修改订单状态,由"待支付"改为"待评价" OrderInfo.objects.filter( order_id=order_id, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update( status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"]) # 响应支付完成页面 context = { 'trade_id': trade_id, } return render(request, 'pay_success.html', context) else: return http.HttpResponseForbidden('非法请求')
def __init__(self, **kwargs): # 首先调用父类的构造函数 super().__init__(**kwargs) # 创建一个Alipay对象 self.alipay = AliPay( # 应用ID appid=settings.ALIPAY_APP_ID, # 接受支付宝的url: 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, ) print(settings.ALIPAY_APP_ID) print(app_private_key_string) print(alipay_public_key_string)
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': '订单错误'}) # 业务处理:使用Python sdk调用支付宝的支付接口 # 初始化 alipay = AliPay( appid="0000000000000000", # 应用id(改成自己应用对应的id) app_notify_url=None, # 默认回调url app_private_key_path = os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_path = os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'), sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False True就会访问沙箱地址 ) # 调用支付接口 # 电脑网站支付,需要跳转到: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 = 'https://openapi.alipaydev.com/gateway.do?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url})
def pay_order(request): # v3.3 获取订单金额 money = request.GET.get("money") # v3.3 获取订单id order_id = request.GET.get("order_id") # v3.2 定义变量存储支付宝应用公钥 alipay_public_key_string = """-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv66JqpsopyoXYMiWiIgyV4O/nc4ptXjRgZO9dkKRzsh1LusdILASoXlZ65nx/4ONCDpFn5QEQQNerVtmCW+Y9N/GmNnQOsEeX5tCxfNlg7vHS5Hk8QDCgIbEzVC3K+9wwYiCc8aQRjSM+Czb/Tq3kI+XJpDIGE6lPtp2zkwZaPt3y8yt88MpYcqPllNn3acEW8U5LnQmMHosohqlXu5iPK57OC7a0oC5AwUPlZcMizO2EqmxonWpfqk+scOhVdyVUwuX6siye76OkUuhO8M1758hhhNOUhmzhurEEW20toqA2eoMP63GweyTt5kWmWcqc30YU0FAN8Aq3QG03wF3xQIDAQAB -----END PUBLIC KEY-----""" # v3.2 定义变量存储支付宝应用私钥 app_private_key_string = """-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAv66JqpsopyoXYMiWiIgyV4O/nc4ptXjRgZO9dkKRzsh1LusdILASoXlZ65nx/4ONCDpFn5QEQQNerVtmCW+Y9N/GmNnQOsEeX5tCxfNlg7vHS5Hk8QDCgIbEzVC3K+9wwYiCc8aQRjSM+Czb/Tq3kI+XJpDIGE6lPtp2zkwZaPt3y8yt88MpYcqPllNn3acEW8U5LnQmMHosohqlXu5iPK57OC7a0oC5AwUPlZcMizO2EqmxonWpfqk+scOhVdyVUwuX6siye76OkUuhO8M1758hhhNOUhmzhurEEW20toqA2eoMP63GweyTt5kWmWcqc30YU0FAN8Aq3QG03wF3xQIDAQABAoIBAHSkuL+qJcX79jf+OKSjBMd+s/dKwtTczdklV5EEl4gXMkA38QS4QM4kc5TMnJgZrJQKKd4fC6uoak/iI6iwUYsKNedD/NQUOvCBIdQl9muAtJmHEaObC8F8wXwTlzPURHBxKrlbZuZiCjrnyYNC3PvKdXeReUJZcXNbLBsD8h6QgVOPaKXnLCSTZf98gHXkDN0IWlNp08143b4Xp6DO+CiaUHUbUrAcHdB+gHQJnN3+YP3dnVGzvyRisjJ8B8mTS1zPk4fpciViA6EMCYLHFCrS+8LZ+WEpJN8o/0o9Mgpd8YPKg1q4WDlYp1ulnRUVqOkJaVZVOvecTtbPbyaJWUECgYEA9fj7peww3VmPNYS3WAAtm/M5YMgsuFNRWC61/o+FKDSVlH57dVRRTnnGF7NE5dUHldloAa+yBw5Zbi/s5LjYV36zvga4dYZpA8Lt4uglzg3QAXwQ+X5YRqkde1gGolOdU/MsnhvehQpdOoZ5XWzJHe/2kA8RNraZyYsER0PQ2hECgYEAx373L2VZZdhPT8EIrgrAU93izxZAS9Cp5A/whogxmVhaKfGHcJa4YygajzyKd3DRoSmYtbXqysGXZyY+RmolCyMeZEBZ1s/2DTj2vtdh3ngV6UQY4vbgpCBgDCOnoiAq/5whcFcTDjma79BmsdHng/ZXgo+5U6v4TrKdZ7ay7nUCgYEArEZnkk175/xLFjPO6d6uExTmMgfhcnRAe9+zbgh9PayeuzNfKs0UaT9W49CWR9bNikGL2+p/aPu+3TLJ22QvehBuuYAhf4bVVGIZlRv9JnV8Ix4PEX9ROqRF1tbPRrADeAHQVSi10D5zD4ORy0JfFg20hi9XYhfAXG12YKd5xtECgYB8t3A6ziZsWCWFG42cmJYSGDYx9pwtiX6cWCarRDuVvTlo3Vkp1t/hBXJNN7Ds6Lf1A/c3KkplhU9sqejmxnbwFn1qeRxxAcO2EnWXazkBBpvUH8FbKrHXiXHiROwInAmlkOsKuzTrgLHO2L9KzYnp4rhkpAtdNrZeJKXo77u+/QKBgF4DmigjHYR32dmKXZQYp2DkM7lFxnuL6McR0r/5b/wkMUPSInCK4n4e8vBH611dkaNNhNSTR5aVsrMZuBGzQrFOGnXawa+PxpGPaVwR/jf/tPCLmsq2KPenQPF15tc+4dosMp726+f+4Klg71qMK8yjGN+fkrHo3Er1y+35Letj -----END RSA PRIVATE KEY-----""" # v3.2 实例化支付应用 alipay = AliPay( appid="2016101000652510", app_notify_url=None, app_private_key_string=app_private_key_string, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2" ) # v3.2 发起支付请求 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, # v3.3 订单号 total_amount=str(money), # v3.3 支付金额 subject="生鲜交易", # 交易主题暂时固定成“"生鲜交易" # v3.3 支付完成要跳转的本地路由 return_url="http://127.0.0.1:8000/Buyer/pay_result/", # v3.3 支付完成要跳转的异步路由 notify_url="http://127.0.0.1:8000/Buyer/pay_result/" ) # v3.7 添加支付成功后订单状态置为2待发货 order = Order.objects.get(order_id=order_id) order.order_status = 2 order.save() # v3.3 发起购买商品跳转支付路由 return HttpResponseRedirect("https://openapi.alipaydev.com/gateway.do?" + order_string)
def kb_alipay(): APP_PRIVATE_KEY_PATH = os.path.join( settings.BASE_DIR, "utils/kbalipay/alipay_keys/app_private.pem") ALIPAY_PUBLIC_KEY_PATH = os.path.join( settings.BASE_DIR, "utils/kbalipay/alipay_keys/alipay_public.pem") app_private_key_string = open(APP_PRIVATE_KEY_PATH).read() alipay_public_key_string = open(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=True # 默认False 配合沙箱模式使用 ) ali_url = { 'alipay_url': settings.ALIPAY_URL, 'return_url': settings.RETURN_URL, 'notify_url': settings.NOTICE_URL, } return ali_url, alipay
def payment_alipay_process(request): order_id = request.session.get('order_id') # 获得订单id order = get_object_or_404(Order, id=order_id) app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read() alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read() host = request.get_host() # 获得host,即网址 alipay = AliPay( appid="2016091400505954", 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.DEBUG # 默认False ) subject = "测试订单" # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order.id, total_amount='{0:.2}'.format(order.get_total_cost().quantize( Decimal('.01'))), subject=subject, return_url='http://{}{}'.format( host, reverse('payment:alipay_done')), # 成功后返回商家的url notify_url='https://{}{}'.format( host, reverse('payment:alipay_done')) # 可选, 不填则使用默认notify url ) # import pdb # pdb.set_trace() if settings.DEBUG: pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string else: pay_url = 'https://openapi.alipay.com/gateway.do?' + order_string return redirect(pay_url)
def generate_order_payment(order_id): '''生成支付宝的支付信息''' user_id = g.user_id try: order = Order.query.filter(Order.id == order_id, Order.status == "WAIT_PAYMENT", Order.user_id == user_id).first() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DATAERR, errmsg="查询订单出错") if not order: return jsonify(errno=RET.NODATA, errmsg="此订单无效") # 构造支付宝的工具对象 alipay_client = AliPay( appid=current_app.config.get("ALIPAY_APPID"), app_notify_url=None, # 默认支付宝通知url app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False, 如果是沙箱模式,debug=True ) # 向支付宝发起手机网站支付的请求 # 手机网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay_client.api_alipay_trade_wap_pay( out_trade_no=order_id, # 我们自己的订单编号 total_amount=str(order.amount / 100.0), # 订单总金额 subject=u"爱家租房-%s" % order_id, # 展示给用户的订单信息 return_url="http://127.0.0.1:5000/payComplete.html", # 支付完成后跳转回的页面路径 notify_url=None) alipay_url = current_app.config.get("ALIPAY_APPID") + "?" + order_string return jsonify(errno=RET.OK, errmsg="OK", data={"alipay_url": alipay_url})
def get(self, request): # get the data from request dict_data = request.GET.dict() sign = dict_data.pop("sign") trade_no = dict_data.get("trade_no") out_trade_no = dict_data.get("out_trade_no") # check the data if not all([sign, trade_no, out_trade_no]): return http.HttpResponseForbidden("非法请求") app_private_key_string = open(settings.ALIPAY_PRIVATE_KEY_PATH).read() alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read() alipay = AliPay( appid=settings.ALIPAY_APPID, app_notify_url=settings.ALIPAY_RETURN_URL, app_private_key_string=app_private_key_string, alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", debug=settings.ALIPAY_DEBUG, ) success = alipay.verify(dict_data, sign) if not success: return http.HttpResponseForbidden("订单信息给篡改了。") # save the data to the database PayModel.objects.create( out_trade_no=out_trade_no, trade_no=trade_no, ) OrderInfo.objects.filter(order_id=out_trade_no).update(status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"]) context = { "order_id": out_trade_no } return render(request, "pay_success.html", context=context)
def pay(request): app_private_key_path = 'keys/app_private_2048.txt' alipay_public_key_path = "keys/alipay_public_2048.txt" alipay = AliPay( appid="2016102200736333", app_notify_url="http://127.0.0.1:8804/page2/", # 默认回调url app_private_key_string=open(app_private_key_path).read(), alipay_public_key_string=open( alipay_public_key_path).read(), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True, # 默认False ) order_string = alipay.api_alipay_trade_page_pay( # out_trade_no=datetime.now().strftime('%Y''%m''%d''%H''%M''%S'), out_trade_no="x2" + str(time.time()), total_amount=0.01, subject="充气式赵俊明", # notify_url="https://blog.csdn.net/" # 可选, 不填则使用默认notify url ) pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string print(pay_url) return redirect(pay_url)
def get(self,request): # 获取参数 out_trade_no = request.GET.get('out_trade_no') print('===1===') # 验证参数的完整性 if not all([out_trade_no]): return HttpResponse('参数有误!') # 验证订单号是否正确 try: order = OrderInfo.objects.get(order_id = out_trade_no) except OrderInfo.DoesNotExist: return HttpResponse('商品不存在!') # 初始化alipay的参数 alipay = AliPay( appid=settings.ALIPAY_APP_ID, # 应用APPID app_notify_url=settings.ALIPAY_APP_NOTIFY_URL, # 默认回调url app_private_key_path=settings.APP_PRIVATE_KEY_PATH, # 应用私钥文件路径 # 支付宝的公钥文件,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH, sign_type="RSA2", # RSA 或者 RSA2 debug=settings.ALIPAY_DEBUG # 默认False,False代表线上环境,True代表沙箱环境 ) # 验证支付结果 response = alipay.api_alipay_trade_query( out_trade_no=out_trade_no, # 商品订单号 ) res_code = response.get('code') status = response.get('trade_status') print(res_code) print(status) if res_code == '10000' and status == 'TRADE_SUCCESS': # 更新交易状态和支付宝交易号 order.order_id = out_trade_no order.order_status = 4 order.trade_no = response.get('trade_no') order.save() return render(request, 'pay_result.html', {'pay_result': '支付成功'}) else: return render(request, 'pay_result.html', {'pay_result': '支付失败'})
def put(self, request): # 获取查询字符串的参数 data = request.query_params.dict() # 取出签证信息 sign = data.pop('sign') # 创建网站链接支付宝的客户端 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, 沙箱环境 ) # 调用verify()验证签证及返回前端的数据是否正确 success = alipay_client.verify(data, sign) if success: # 创建交易成功的数据,在模型类中添加当前交易的信息 # 订单编号 order_id = data.get('out_trade_no') # 支付宝支付流水号 trade_id = data.get('trade_no') Payment.objects.create(order_id=order_id, trade_id=trade_id) # 修改订单的状态 OrderInfo.objects.filter( order_id=order_id, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update( status=OrderInfo.ORDER_STATUS_ENUM['UNSEND']) # 返回客户交易成功的流水号 return Response({'trade_id': trade_id}) else: return Response({'message': '非法请求'}, status=status.HTTP_403_FORBIDDEN)
def pay(request, order_code): alipay = AliPay( appid='2016092700609211', app_notify_url=None, # 默认回调url app_private_key_path=os.path.join(settings.BASE_DIR, "alipay/app_private_key.pem"), alipay_public_key_path=os.path.join(settings.BASE_DIR, "alipay/alipay_public_key.pem"), sign_type="RSA2", debug=True) order = Order.objects.get(order_code=order_code) order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_code, total_amount=float(order.total_amount), subject='商品支付信息', return_url='http://127.0.0.1:8000/payback/', ) alipay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string return redirect(alipay_url)
def get(self, request, order_id): """获取支付链接""" # 判断订单信息是否正确 try: order = OrderInfo.objects.get( pk=order_id, user=request.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 = 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 ) # 构造支付宝支付链接地址 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_CALLBACK_URL + "pay_success.html", ) alipay_url = settings.ALIPAY_URL + "?" + order_string return Response({"alipay_url": alipay_url})
def init_alipay_cfg(appID:str, publicKey:str, privateKey:str, callbackUrl:str): ''' 初始化alipay配置 :return: alipay 对象 ''' ssl._create_default_https_context = ssl._create_unverified_context publicKey = '''-----BEGIN PUBLIC KEY-----\n ''' + publicKey + '''\n-----END PUBLIC KEY-----''' privateKey = '''-----BEGIN RSA PRIVATE KEY-----\n''' + privateKey + '''\n-----END RSA PRIVATE KEY-----''' # print(publicKey) alipay = AliPay( appid=appID, app_notify_url=callbackUrl, # 默认回调url # app_private_key_string=app_private_key_string, # alipay_public_key_string=alipay_public_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, app_private_key_string=privateKey, alipay_public_key_string=publicKey, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=False # 默认False ,若开启则使用沙盒环境的支付宝公钥 ) return alipay
def get(self, request, order_id): try: # 校验 order = OrderInfo.objects.get(order_id=order_id, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'], user=request.user) except OrderInfo.DoesNotExist: return http.HttpResponseForbidden('订单有误') # 创建alipay SDK对像 # # ALIPAY_APPID = '2016091900551154' # ALIPAY_DEBUG = True # 表示是沙箱环境还是真实支付环境 # ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do' # ALIPAY_RETURN_URL = 'http://www.meiduo.site:8000/payment/status/' # 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 # Ture就是测试沙箱环境 ) # 调用SDK方法获取到支付链接查询参数 # 电脑网站支付,需要跳转到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='美多商城:%s' % order_id, # 支付时的主题 return_url=settings.ALIPAY_RETURN_URL ) # 拼接支付宝支付界面url alipay_url = settings.ALIPAY_URL + "?" + order_string # 响应 return http.JsonResponse({'code': '0', 'errmsg': 'ok', '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_string = open(os.path.join(os.path.dirname(__file__), 'keys/app_private_key.pem')).read() alipay_public_key_string = open(os.path.join(os.path.dirname(__file__), 'keys/alipay_public_key.pem')).read() # 创建支付宝的SDK工具对象 alipay = AliPay( appid="2021000118643231", app_notify_url=None, # the default notify path app_private_key_string=app_private_key_string, # alipay public key, do not use your own public key! alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA or RSA2 debug=True, # False by default # config=AliPayConfig(timeout=15) # optional, request timeout ) order_string = alipay.api_alipay_trade_wap_pay( out_trade_no=order.id, # 订单编号 total_amount=str(order.amount/100.0), # 总金额 subject='爱家 %s' % order.id, # 订单标题 return_url="http://127.0.0.1:5000/payComplete.html", # 返回的链接地址 notify_url=None # this is optional ) # 构建让用户跳转的支付链接地址 pay_url = constants.ALIPAY_URL_PREFIX + order_string return jsonify(errno=RET.OK, errmsg='OK', data={'pay_url':pay_url})
def save_order_payment_result(): '''保存订单支付结果''' alipay_dict = request.form.to_dict() # 对支付宝进行数据分离 提取支付宝的签名参数sign和剩下的数据 alipay_sign = alipay_dict.pop("sign") # 创建支付宝工具对象 alipay = AliPay( appid="2016102200736882", # 应用id app_notify_url=None, # 默认回调url app_private_key_string=open( os.path.join(os.path.dirname(__file__), 'keys/rsa_private_key.pem')).read(), alipay_public_key_string=open( os.path.join(os.path.dirname(__file__), 'keys/alipay_public_key.pem')).read(), sign_type="RSA2", # RSA 或 RSA2 debug=True # 默认false ) # 借助工具验证参数的合法性 # 如果参数是支付宝返回的,result返回True,否则返回false result = alipay.verify(alipay_dict, alipay_sign) if result: order_id = alipay_dict.get("out_trade_no") trade_no = alipay_dict.get("trade_no") # 支付宝的交易号 try: Order.query.filter_by(id=order_id).update({ "status": "WAIT_COMMENT", "trade_no": trade_no }) db.session.commit() except Exception as e: current_app.logger.error(e) db.session.rollback() return jsonify(errno=RET.OK, errmsg="ok")
def save_order_payment_result(): '''保存订单支付结果''' alipay_data = request.form.to_dict() # sign must be poped out # 对支付宝的数据进行分离操作 提取出支付宝的签名参数sign值 和 剩下的其他数据 signature = alipay_data.pop("sign") print(json.dumps(alipay_data)) print(signature) app_private_key_string = open(os.path.join(os.path.dirname(__file__), 'keys/app_private_key.pem')).read() alipay_public_key_string = open(os.path.join(os.path.dirname(__file__), 'keys/alipay_public_key.pem')).read() # 创建支付宝的SDK工具对象 alipay = AliPay( appid="2021000118643231", app_notify_url=None, # the default notify path app_private_key_string=app_private_key_string, # alipay public key, do not use your own public key! alipay_public_key_string=alipay_public_key_string, sign_type="RSA2", # RSA or RSA2 debug=True, # False by default # config=AliPayConfig(timeout=15) # optional, request timeout ) # verify # 借助工具验证参数的合法性 # 如果确定参数是支付宝的,返回True,否则返回False result = alipay.verify(alipay_data, signature) order_id = alipay_data.get('out_trade_no') trade_no = alipay_data.get('trade_no') if result: try: Order.query.filter_by(id=order_id).update({'status':'WAIT_COMMENT', 'trade_no':trade_no}) db.session.commit() except Exception as e: current_app.logger.error(e) db.session.rollback() return jsonify(errno=RET.OK, errmsg='OK')
def get(self, request, order_id): """ 获取支付链接 """ # 判断订单信息是否正确 try: order = OrderInfo.objects.get( order_id=order_id, user=request.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 = 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 ) 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", ) # 需要跳转到https://openapi.alipay.com/gateway.do? + order_string # 拼接链接返回前端 alipay_url = settings.ALIPAY_URL + "?" + order_string return Response({'alipay_url': alipay_url})
def post(self, request): """""" # 订单id order_id = request.POST.get("order_id") if not order_id: return JsonResponse({"code": 2, "message": "缺失订单号"}) # 获取订单的信息 try: 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 配合沙箱模式使用 ) # 电脑网站支付,需要跳转到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="天天生鲜%s" % order_id, return_url=None, notify_url=None # 可选, 不填则使用默认notify url ) # 让用户进行支付的支付宝页面网址 url = settings.ALIPAY_URL + "?" + order_string return JsonResponse({"code": 0, "message": "请求支付成功", "url": url})
def alipay(request): alipay = AliPay( appid="2016101200665774", app_notify_url=None, # 默认回调url app_private_key_string=app_private_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_string=alipay_public_key_string, sign_type="RSA", # RSA 或者 RSA2 debug=False # 默认False ) subject = "兰波激励" # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string order_string = alipay.api_alipay_trade_page_pay( out_trade_no="20161112", total_amount=10, subject=subject, return_url="https://www.1000phone.com", notify_url="https://www.1000phone.com" # 可选, 不填则使用默认notify url ) return redirect('https://openapi.alipaydev.com/gateway.do?' + order_string)
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="订单数据有误") # 创建支付宝sdk的工具对象 alipay_client = AliPay( appid="2021000116672604", # 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 ) # 手机网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string order_string = alipay_client.api_alipay_trade_wap_pay( out_trade_no=order.id, # 订单编号 total_amount=str(order.amount / 100.0), # 总金额 subject="爱家租房 {}".format(order.id), # 订单标题 return_url="http://192.168.193.211:5002/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 OrderInfo.DoesNotExist: return http.HttpResponseForbidden("无效订单") # 创建支付宝支付对象 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 ) # 响应登录支付宝连接 alipay_url = settings.ALIPAY_URL + "?" + order_string return http.JsonResponse({"code": RETCODE.OK, "errmsg": "OK", "alipay_url": alipay_url})
def order_pay(request): 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="2016092300575166", 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.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})
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="数据库异常") # 创建支付宝sdk的工具对象 alipay_client = AliPay( appid="2016101000651833", app_notify_url=None, app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"), alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/ali_pay_public_key.pem"), sign_type="RSA2", debug=True) # 手机网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do + order_string order_string = alipay_client.api_alipay_trade_wap_pay( out_trade_no=order.id, # 订单编号 total_amount=str(order.amount / 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 # 校验订单order_id 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) # 根据订单的数据,向支付宝发起请求,获取支付链接参数 with open('keys/app_private_key.pem', 'r') as f1: app_private_key_string = f1.read() with open('keys/alipay_public_key.pem', 'r') as f2: alipay_public_key_string = f2.read() alipay_client = 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 = 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", ) # 需要跳转到https://openapi.alipay.com/gateway.do? + order_string # 拼接链接返回前端 alipay_url = settings.ALIPAY_GATEWAY_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="订单数据有误") # 创建支付宝sdk的工具对象 alipay_client = AliPay( appid=constants.ALIPAY_APP_ID, app_notify_url=None, # 默认回调url app_private_key_path=constants.ALIPAY_APP_PRIVATE_KEY, # 私钥 alipay_public_key_path=constants. ALIPAY_PUBLIC_KEY, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False ) # 手机网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string order_string = alipay_client.api_alipay_trade_wap_pay( out_trade_no=order.id, # 订单编号 total_amount=str(order.amount / 100.0), # 总金额 subject=u"爱家租房 %s" % order.id, # 订单标题 return_url=constants.ALIPAY_RESULT_URL, # 返回的连接地址 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): """处理get返回结果的数据""" # 接受数据 data = request.query_params.dict() print(data) # sign 不能参与签名验证 signature = data.pop("sign") # print(json.dumps(data)) # print(signature) alipay = AliPay( appid=settings.ALIPAY_APP_ID, app_notify_url=None, # 默认回调url app_private_key_path=settings.APP_PRIVATE_KEY_PATH, # 应用私钥 alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH, # 支付宝的公钥 sign_type="RSA2", # 密码加密的算法 debug=settings.ALIPAY_DEBUG # 开发时属于调试模式, 默认False ) # verify验证支付结果,布尔值 success = alipay.verify(data, signature) if success: # 支付成功 order = Order.objects.get(order_number=data.get("out_trade_no")) order.order_status = 1 # 修改订单状态 order.pay_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") order.save() return Response( { "length": order.order_course.count(), "paytime": order.pay_time, "price": order.total_price, "info": order.order_desc, 'staus': 'OK', }, status=status.HTTP_200_OK) return Response({"message": "订单没有变化"})
def save_order_payment_result(): """保存订单支付结果""" alipay_dict = request.form.to_dict() # 对支付宝的数据进行分离 提取出支付宝的签名参数sign 和剩下的其他数据 alipay_sign = alipay_dict.pop("sign") # 创建支付宝sdk的工具对象 alipay_client = AliPay( appid="2016081600258081", app_notify_url=None, # 默认回调url app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"), # 私钥 alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False ) # 借助工具验证参数的合法性 # 如果确定参数是支付宝的,返回True,否则返回false result = alipay_client.verify(alipay_dict, alipay_sign) if result: # 修改数据库的订单状态信息 order_id = alipay_dict.get("out_trade_no") trade_no = alipay_dict.get("trade_no") # 支付宝的交易号 try: Order.query.filter_by(id=order_id).update({ "status": "WAIT_COMMENT", "trade_no": trade_no }) db.session.commit() except Exception as e: current_app.logger.error(e) db.session.rollback() return jsonify(errno=RET.OK, errmsg="OK")
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': '订单错误!'}) alipay = AliPay( appid=settings.ALIPAY_APP_ID, app_notify_url=None, # 默认回调url app_private_key_path=settings.APP_PRIVATE_KEY_PATH, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False ) 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 # 可选, 不填则使用默认notify url ) pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url})