def __init__(self, trade_no, price=0.01): self.UID = "2016101200668491" self.ZFB_DNS = "https://openapi.alipaydev.com/gateway.do" self.APP_PRIVATE = """-----BEGIN RSA PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCBWkjIWeZMyYVBD9YNOYP6n0qPZrM3ZYt1cVzSG/ClARgJdJqsy1eGLHKe3ieeaoqJRu8PvRzYwgbBXa8IlsddT3y7+ERi9kohMWrafHCAT2aqxXdEaRq3KH0x2el8KnSBYq6Mv1K4WVZ60+D2IYAMtRUPCjm3opIGndZ5iEdkClhynMQ/wBc4xyexxQVPdhtF+GDEFQD92WzWGk1XM8/wgwjiGvUeZa42I1+6O59yVZywaQydFFoXnAXmSaLJ1j+GOAEu6c098e8a/r1Q0WXI9WhiKgAR/is39IOPhseuyHi2ueux64DjSmpxRvRjupyBNXxkQ+V6SSBtw6uMK9/RAgMBAAECggEAJzjZGOcpjd8NKM1Een4WJshmM1VQwltoDhRxsMQIFABg6X0R6ZM+1tBjcQirur1ThIydsIgHVzJ+GePuTwxpJ0IS8Gw3UEqd77KsU9OnyUBKQT3fDD9SencsfxE0WxIEgbcKdmMNEhkEv/m/HOLLkQ7Xc9gF6EjDPn5dqjxIaWzLQqgcqKmxMOznUv5XQAp5nLRrgWgJgS3tdxPt2ojRnKsHEmfgu6jskL+X7jn4R5Br9LXjXAXS7q7tZtHI80oZzE+nGyAhdkKJgvyalpE5MnmjkbwJVasTM6Ly1CSFDpETu75ZnAHiEQIXmnMp2KJlWzlYWjRwkQtRIpU23vK2AQKBgQC6Db/LOQfxzhET5pJpYoYGdkbr1aRmGJquoi9EYTjzaMisyg+VmwzIuFrN6JuugGG3GCUG7If8sOdCiP7img4qjVHt+TE+1mQR3nHUQUeh79awNpkr7Usgbdbr9mf/pxsL5Z80mA6jLkaTMKV+WpnljsLnUEtllTNLLFViQfcd5QKBgQCx+34qsORVt9MIqiVJFiOxXo8inWOvY4AZp702iHHXgzyUMP+VeIEwmai3J41OgOMn5ieuEHtFOikQlcd0roFrqnOih6nCeGeHa3eBV4cWqQ7FNx0NoO6z0uZE2l2HeZUSyKBq6N1Nl7FIQBRrk+T3SXJUhFjTGKsJBL/+ajy7fQKBgFa268o7BYHkyj7dOyYU/mRqoflu9JWFKCr2elNDgPipwMYP0x2mS1oN2nyXyl+VhHWCslc8zNCwXsi68xkINkwM27+vYg1ofPF7HNCRsGJAV25/s/ouOdKefwoxKR2Vc9yipAYuTLwvaENX6/otHgdI93w6BzoMRQDnY9BM8HElAoGAeNqRqEFnOoFRDiAio0ciQ202+kUvDEgfEsygoafyzWkyuFmxIvipmKuuMXfs7rJ8DHqu1PYiDjbY7YcW4bcg8E/UpzdBYWjKu9yQUEZz10JCYk3zL27oxzhc3cH9ImG/hPqwWwf2RZrMaYgBla7eGcBInvUjL2wfr0cHa6UNyi0CgYBCOYdMFk72i0GCpVwMLp4/I8N97BLhDtRf0N55i/nUCZwGOQijyfFKoP0GlgfO0eSVzUNZl25sYcwTyzOZLhOpmEAX/Z1yyd4DaUUXu/vx5If5Gtr1TFiCmjDion78BRqoXg5RCHQs6uWpq2D0YhoO/2qKsrvoYqw5twsx40u/8w== -----END RSA PRIVATE KEY-----""" self.APP_PUBLIC = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgVpIyFnmTMmFQQ/WDTmD+p9Kj2azN2WLdXFc0hvwpQEYCXSarMtXhixynt4nnmqKiUbvD70c2MIGwV2vCJbHXU98u/hEYvZKITFq2nxwgE9mqsV3RGkatyh9MdnpfCp0gWKujL9SuFlWetPg9iGADLUVDwo5t6KSBp3WeYhHZApYcpzEP8AXOMcnscUFT3YbRfhgxBUA/dls1hpNVzPP8IMI4hr1HmWuNiNfujufclWcsGkMnRRaF5wF5kmiydY/hjgBLunNPfHvGv69UNFlyPVoYioAEf4rN/SDj4bHrsh4trnrseuA40pqcUb0Y7qcgTV8ZEPlekkgbcOrjCvf0QIDAQAB" self.ZFB_PUBLIC = """-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl7OwhGmH/J2aSP3j4Pbk/NxvNhBfAIBDCEujBN9vdnCu3kKA5SNkomvHvdHXM66/3LQhKzigMg9r/y6CrgQJPR8Q+wHrRiGXbLmIqJw2pMVfXgms1gr1Mz9aR3GbuIzTMOLcHALWPQ47cNtgPUg1UfRE0NyJMpZ3+crg9Dzt5fJ7BJK+7m9FDX8v7R0axahEkkO0IYaxqHOvZ5v0pygls3z2ZM0gVon63cu1K8PxD2KsNHwK8dUkw6uDY2VqkyYybQGRlT4VWQkDYdPNqzMDmjV7Y4DjX+b/JV+Wu7mYY6llosNT30yQhKhcb1C5MEPulvbeOrjdxP59+niERAV/4QIDAQAB -----END PUBLIC KEY-----""" self.trade_no = trade_no self.subject = "vip充值" self.price = price self.NOTIFY_URL = None self.RETURN_URL = "http://127.0.0.1:8000/recharge_vip/" self.BASE_DIR = os.path.dirname( os.path.dirname(os.path.abspath(__file__))) self.ali = alipay.AliPay( appid=self.UID, app_notify_url=None, # 默认回调url app_private_key_string=self.APP_PRIVATE, alipay_public_key_string=self. ZFB_PUBLIC, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False )
def get(self, request): # 接受订单id order_id = request.GET.get('order_id') if not order_id: return JsonResponse({'code': 2, 'message': '缺少订单id'}) # 校验订单id 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 as e: return JsonResponse({'code': 2, 'message': '订单不存在'}) # 创建alipay 对象对接支付宝 my_alipay = alipay.AliPay( appid=settings.ALIPAY_APPID, 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=>2048 openssl debug=True # 默认False True 是沙箱模式 ) # 循环查询,直到成功|失败 while True: # 调用查询接口,读取code 和trade_status 判断订单状态 response_dict = my_alipay.api_alipay_trade_query(order_id) # 一种接受商家维护的订单id去查 | 也可以接受支付宝维护的订单id去查 # 上面的返回值一个字典,包含了支付宝相应给调用者的参数信息 包括 code 和trade_status 和trade_no(支付宝维护的订单id) code = response_dict.get('code') trade_status = response_dict.get('trade_status') if code == '10000' and trade_status == 'TRADE_SUCCESS': order.trade_id = response_dict.get('trade_no') order.status = OrderInfo.ORDER_STATUS_ENUM['UNCOMMENT'] order.save() return JsonResponse({'code': 0, 'message': '支付ok'}) elif code == '40004' or (code == '10000' and trade_status == 'WAIT_BUYER_PAY'): # 有待商量,继续等待继续查询 continue else: # 失败 return JsonResponse({'code': 4, 'message': '支付失败'})
def post(self, request): """接受订单信息order_id 查询订单 创建alipay 调用接口 返回url(json) 跳转""" order_id = request.POST.get('order_id') if not order_id: return JsonResponse({'code': 3, 'message': '缺少订单id'}) # 校验订单id 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 as e: return JsonResponse({'code': 2, 'message': '订单不存在'}) # 创建alipay 对象对接支付宝 my_alipay = alipay.AliPay( appid=settings.ALIPAY_APPID, 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=>2048 openssl debug=True # 默认False True 是沙箱模式 ) # 电脑网站支付,需要跳转到https://openapi.alipay[dev].com/gateway.do? + order_string order_string = my_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 url = settings.ALIPAY_URL + '?' + order_string # 响应url给前台(JsonResponse) return JsonResponse({'code': 0, 'message': '支付成功', 'url': url})
import alipay UID = "2016101200668491" ZFB_DNS = "https://openapi.alipaydev.com/gateway.do" APP_PRIVATE = """-----BEGIN RSA PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCBWkjIWeZMyYVBD9YNOYP6n0qPZrM3ZYt1cVzSG/ClARgJdJqsy1eGLHKe3ieeaoqJRu8PvRzYwgbBXa8IlsddT3y7+ERi9kohMWrafHCAT2aqxXdEaRq3KH0x2el8KnSBYq6Mv1K4WVZ60+D2IYAMtRUPCjm3opIGndZ5iEdkClhynMQ/wBc4xyexxQVPdhtF+GDEFQD92WzWGk1XM8/wgwjiGvUeZa42I1+6O59yVZywaQydFFoXnAXmSaLJ1j+GOAEu6c098e8a/r1Q0WXI9WhiKgAR/is39IOPhseuyHi2ueux64DjSmpxRvRjupyBNXxkQ+V6SSBtw6uMK9/RAgMBAAECggEAJzjZGOcpjd8NKM1Een4WJshmM1VQwltoDhRxsMQIFABg6X0R6ZM+1tBjcQirur1ThIydsIgHVzJ+GePuTwxpJ0IS8Gw3UEqd77KsU9OnyUBKQT3fDD9SencsfxE0WxIEgbcKdmMNEhkEv/m/HOLLkQ7Xc9gF6EjDPn5dqjxIaWzLQqgcqKmxMOznUv5XQAp5nLRrgWgJgS3tdxPt2ojRnKsHEmfgu6jskL+X7jn4R5Br9LXjXAXS7q7tZtHI80oZzE+nGyAhdkKJgvyalpE5MnmjkbwJVasTM6Ly1CSFDpETu75ZnAHiEQIXmnMp2KJlWzlYWjRwkQtRIpU23vK2AQKBgQC6Db/LOQfxzhET5pJpYoYGdkbr1aRmGJquoi9EYTjzaMisyg+VmwzIuFrN6JuugGG3GCUG7If8sOdCiP7img4qjVHt+TE+1mQR3nHUQUeh79awNpkr7Usgbdbr9mf/pxsL5Z80mA6jLkaTMKV+WpnljsLnUEtllTNLLFViQfcd5QKBgQCx+34qsORVt9MIqiVJFiOxXo8inWOvY4AZp702iHHXgzyUMP+VeIEwmai3J41OgOMn5ieuEHtFOikQlcd0roFrqnOih6nCeGeHa3eBV4cWqQ7FNx0NoO6z0uZE2l2HeZUSyKBq6N1Nl7FIQBRrk+T3SXJUhFjTGKsJBL/+ajy7fQKBgFa268o7BYHkyj7dOyYU/mRqoflu9JWFKCr2elNDgPipwMYP0x2mS1oN2nyXyl+VhHWCslc8zNCwXsi68xkINkwM27+vYg1ofPF7HNCRsGJAV25/s/ouOdKefwoxKR2Vc9yipAYuTLwvaENX6/otHgdI93w6BzoMRQDnY9BM8HElAoGAeNqRqEFnOoFRDiAio0ciQ202+kUvDEgfEsygoafyzWkyuFmxIvipmKuuMXfs7rJ8DHqu1PYiDjbY7YcW4bcg8E/UpzdBYWjKu9yQUEZz10JCYk3zL27oxzhc3cH9ImG/hPqwWwf2RZrMaYgBla7eGcBInvUjL2wfr0cHa6UNyi0CgYBCOYdMFk72i0GCpVwMLp4/I8N97BLhDtRf0N55i/nUCZwGOQijyfFKoP0GlgfO0eSVzUNZl25sYcwTyzOZLhOpmEAX/Z1yyd4DaUUXu/vx5If5Gtr1TFiCmjDion78BRqoXg5RCHQs6uWpq2D0YhoO/2qKsrvoYqw5twsx40u/8w== -----END RSA PRIVATE KEY-----""" APP_PUBLIC = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgVpIyFnmTMmFQQ/WDTmD+p9Kj2azN2WLdXFc0hvwpQEYCXSarMtXhixynt4nnmqKiUbvD70c2MIGwV2vCJbHXU98u/hEYvZKITFq2nxwgE9mqsV3RGkatyh9MdnpfCp0gWKujL9SuFlWetPg9iGADLUVDwo5t6KSBp3WeYhHZApYcpzEP8AXOMcnscUFT3YbRfhgxBUA/dls1hpNVzPP8IMI4hr1HmWuNiNfujufclWcsGkMnRRaF5wF5kmiydY/hjgBLunNPfHvGv69UNFlyPVoYioAEf4rN/SDj4bHrsh4trnrseuA40pqcUb0Y7qcgTV8ZEPlekkgbcOrjCvf0QIDAQAB" ZFB_PUBLIC = """-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl7OwhGmH/J2aSP3j4Pbk/NxvNhBfAIBDCEujBN9vdnCu3kKA5SNkomvHvdHXM66/3LQhKzigMg9r/y6CrgQJPR8Q+wHrRiGXbLmIqJw2pMVfXgms1gr1Mz9aR3GbuIzTMOLcHALWPQ47cNtgPUg1UfRE0NyJMpZ3+crg9Dzt5fJ7BJK+7m9FDX8v7R0axahEkkO0IYaxqHOvZ5v0pygls3z2ZM0gVon63cu1K8PxD2KsNHwK8dUkw6uDY2VqkyYybQGRlT4VWQkDYdPNqzMDmjV7Y4DjX+b/JV+Wu7mYY6llosNT30yQhKhcb1C5MEPulvbeOrjdxP59+niERAV/4QIDAQAB -----END PUBLIC KEY-----""" ali = alipay.AliPay( appid=UID, app_notify_url=None, # 默认回调url app_private_key_string=APP_PRIVATE, alipay_public_key_string=ZFB_PUBLIC, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False ) import time # trade_no = str(int(time.time())) subject = "vip充值" price = 0.01 order_string = ali.api_alipay_trade_app_pay( out_trade_no=trade_no, total_amount=price, subject=subject, notify_url=None # 可选, 不填则使用默认notify url )