def test_seach_phone(self): body = {"mobile": "m6zea9UPXp1LKzYzd1YWow=="} sign = auth.sign('searchPczPriceList', self.uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=searchPczPriceList&clientVersion=5.3.0&build=36639&client=android&osVersion=4.4.2&screen=1920*1080&partner=waps007&uuid=%s&area=1_0_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( self.uuid, sign[1], sign[0]) headers = { 'Charset': 'UTF-8', 'jdc-backup': self.cookie, 'Connection': 'close', 'Cookie': self.cookie, 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; Nexus Build/KOT49H)', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } resp = requests.post(url, data='body=' + urllib.quote_plus(json.dumps(body)) + '&', headers=headers) print resp.text resp = resp.json() data = filter(lambda sku: sku['facePrice'] == '100', resp['skuList']) print len(data) print str(float(data[0]['jdPrice']) / 100)
def test_get_h5_cookie(self): uuid = '863175026618021-a8a6681e316b' body = {"action": "to", "to": 'https%3A%2F%2Ftrain.m.jd.com'} print body sign = auth.sign('genToken', uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=genToken&clientVersion=5.8.0&build=36639&client=android&d_brand=ZTE&d_model=SCH-I779&osVersion=4.4.2&screen=1280*720&partner=tencent&uuid=%s&area=1_2802_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]) print url headers = { 'Charset': 'UTF-8', 'Connection': 'close', 'Cookie': self.cookie, 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; Nexus Build/KOT49H)', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'} req = requests.post(url, data='body=' + urllib.quote(json.dumps(body)) + '&', headers=headers) print req.text resp = req.json() # {"code":"0","tokenKey":"AAEAMKMEfWAYh1fRAvE0siwbJrEjuCmaht3Of-dkAaMMpGzemdi7WsCeMn3EaUdejhCZvQ0","url":"http://un.m.jd.com/cgi-bin/app/appjmp"} url = 'http://un.m.jd.com/cgi-bin/app/appjmp?tokenKey=' + resp[ 'tokenKey'] + '&to=https%3A%2F%2Ftrain.m.jd.com&lbs=%7B%22provinceId%22%3A%2218%22%2C%22districtName%22%3A%22%E5%B2%B3%E9%BA%93%E5%8C%BA%22%2C%22districtId%22%3A%2248936%22%2C%22cityId%22%3A%221482%22%2C%22cityName%22%3A%22%E9%95%BF%E6%B2%99%E5%B8%82%22%2C%22provinceName%22%3A%22%E6%B9%96%E5%8D%97%22%2C%22lng%22%3A%22112.883301%22%2C%22lat%22%3A%2228.207992%22%7D' session = requests.session() req = session.get(url, headers={ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'User-Agent': 'jdapp;android;5.4.1;4.4.2;863175026618021-a8a6681e316b;network/wifi;osp/android;apv/5.4.1;osv/4.4.2;uid/863175026618021-a8a6681e316b;pv/87.20;psn/863175026618021-a8a6681e316b|94;psq/15;ref/;pap/JA2015_311210|5.4.1|ANDROID 4.4.2;usc/;ucp/;umd/;utr/;adk/;ads/;Mozilla/5.0 (Linux; Android 4.4.2; NX507J Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.8 TBS/036872 Safari/537.36'}) print session.cookies.get_dict()
def test_phone_charge(self): body = { "facePrice": "10", "isBingding": "0", "isNote": "0", "jdPrice": "10.00", "payType": "0", "type": "1", "contact": "false", "mobile": '945UOUTLqNSLi+9eu1zb1g==' } # body = {"facePrice": "10", "isBingding": "0", "isNote": "0", "jdPrice": "10.00", "payType": "0", # "type": "1", "contact": "false", "mobile": "945UOUTLqNSLi+9eu1zb1g=="} sign = auth.sign('submitPczOrder', self.uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=submitPczOrder&client=android&clientVersion=5.3.0&build=36639&d_brand=ZTE&d_model=SCH-I779&osVersion=4.4.2&screen=1280*720&partner=tencent&uuid=%s&area=1_0_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( self.uuid, sign[1], sign[0]) headers = { 'Charset': 'UTF-8', 'jdc-backup': self.cookie, 'Connection': 'close', 'Cookie': self.cookie, 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; Nexus Build/KOT49H)', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } resp = requests.post(url, data='body=' + urllib.quote_plus(json.dumps(body)) + '&', headers=headers) print resp.text
def get_couponList(self, cookie, id): headers = { 'Accept-Encoding': 'gzip,deflate', 'jdc-backup': cookie, 'Cookie': cookie, 'Charset': 'UTF-8', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.2;)' } body = {"pageSize": "100", "page": "1"} sign = auth.sign('configCouponList', self.uuid, json.dumps(body)) resp = requests.post( url= 'http://api.m.jd.com/client.action?functionId=configCouponList&clientVersion=5.8.0&build=42523&client=android&d_brand=nubia&d_model=NX507J&osVersion=4.4.2&screen=1920*1080&partner=jingdong2&uuid=%s&area=1_2802_2821_0&networkType=wifi&st=%s&sign=%s&sv=111' % ( #url = 'http://api.m.jd.com/client.action?functionId=configCouponList&clientVersion=5.8.0&build=42523&client=android&d_brand=&d_model=&osVersion=&screen=1280*720&partner=tencent&uuid=%s&area=1_2802_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( self.uuid, sign[1], sign[0]), data='body=' + urllib.quote(json.dumps(body)) + '&', headers=headers) logger.debug(resp.url) logger.debug(resp.text) list = resp.json() if id: return filter(lambda c: c['id'] == id, list['couponList']) else: return list
def _build_payload(self, message): json_msg = json.dumps(message) signature = auth.sign(json_msg, self.cfg['keys']['private']) return { 'message': json_msg, 'signature': signature, 'username': self.cfg['api']['username'] }
def send(plaintext, auth, recipient, ttl=0, **kwargs): ''' Encrypt the contents to a keybase-saltpack; push it to Twitter, GitHub. ''' queue = kwargs['queue'] if 'queue' in kwargs else None debug = kwargs['debug'] if 'debug' in kwargs else False future = int(datetime.utcnow().strftime('%s')) + ttl prefix = 'twitter-message-bus' if status(debug): LOGGER.info('[keybase-status] client-up; signed-in') # Do a look-up on Keybase for a valid recipient ID. if lookup(recipient, debug): LOGGER.info('[keybase-lookup] %s exists', recipient) # Encrypt the document. encrypted = encrypt(plaintext, recipient, debug) # Sign the document. signed = sign(encrypted, debug) # Post the gist. gist_id, _hash = post(content=signed, username=recipient, debug=debug, token=auth[0]) if gist_id: prefix = '-'.join([prefix, _hash]) LOGGER.info('[gist] %s', gist_id) try: # Logic for gists/tweets with TTL. if gist_id and ttl and queue and encrypted: message = '~'.join(['gist', gist_id, str(future)]) queue.add_job('out', message) LOGGER.info('[gist-queue] added %s to \'out\'', message) tweet = None if gist_id: tweet = auth[1].update_status(':'.join([prefix, gist_id])) LOGGER.debug('[tweet] %s', tweet) LOGGER.info('[tweet] %s', tweet.id) if tweet and ttl and queue: message = '~'.join(['tweet', tweet.id_str, str(future)]) queue.add_job('out', message) LOGGER.info('[tweet-queue] added %s to \'out\'', message) return gist_id, tweet.id except Exception: LOGGER.error('[queue] unable to write to queue; data lost!') else: LOGGER.error('[keybase-lookup] lookup for %s failed!', recipient) else: LOGGER.error('[keybase-status] client-down/signed-out!')
def login(): global cookie resp = post("login", {'username': username}) if resp.status_code != 200: return False data = json.loads(resp.text) client_secret = b64d(data['client_secret']) secret = auth.decrypt(client_secret) sig = auth.sign(secret) resp = post("authorise", {'username': username, 'server_secret': data['server_secret'], 'signature': b64e(str(sig))}) if resp.status_code == 200: cookie = resp.cookies return True return False
def test_queryPczFavourableInfo(self): body = {} sign = auth.sign('queryPczFavourableInfo', self.uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=queryPczFavourableInfo&clientVersion=5.8.0&build=42523&client=android&d_brand=nubia&d_model=NX507J&osVersion=4.4.2&screen=1920*1080&partner=waps007&uuid=%s&area=1_0_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( self.uuid, sign[1], sign[0]) headers = { 'Charset': 'UTF-8', 'jdc-backup': self.cookie, 'Connection': 'close', 'Cookie': self.cookie, 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; Nexus Build/KOT49H)', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'} resp = requests.post(url, data='body=' + urllib.quote_plus(json.dumps(body)) + '&', headers=headers) print resp.text
def ws_sample(): method = "GET" path = "/ws" sign_headers = {"host": ws_host} authorization = sign(ak, sk, method, path, None, sign_headers) headers = { "hobot_xpush_client_id": "test_client_id", "authorization": authorization } ws = websocket.WebSocketApp("ws://" + ws_host + path, header=headers, on_message=on_message, on_error=on_error, on_close=on_close) ws.on_open = ws_on_open ws.run_forever()
def send_message(name, msg): keyA, body = auth.aes_encrypt(msg) body = b64e(body) recipient_key = key_for(name) if recipient_key is None: return False keyA2 = keyA keyA = b64e(auth.encrypt(keyA, recipient_key)) keyA2 = b64e(auth.encrypt(keyA2, auth.public_key())) payload = {'sender': username, 'recipient': name, 'body': body, 'key': keyA, 'sender_key': keyA2} sig = b64e(str(auth.sign(username+name+body))) payload['signature'] = str(sig) keyB, payload = auth.aes_encrypt(json.dumps(payload)) payload = b64e(payload) keyB = b64e(auth.encrypt(keyB, auth.server_key())) post("messages", {'key': keyB, 'payload': payload})
def get_user_info_test(self): body = '{"flag":"nickname"}' uuid = '' sign = auth.sign('newUserInfo', uuid, body) print sign url = 'http://api.m.jd.com/client.action?functionId=newUserInfo&clientVersion=5.8.0&build=36639&client=android&d_brand=ZTE&d_model=SCH-I779&osVersion=4.4.2&screen=1280*720&partner=tencent&uuid=%s&area=1_2802_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]) print url req = requests.post(url, data='body=' + urllib.quote(body) + '&', headers={ 'Charset': 'UTF-8', 'Connection': 'close', 'Cookie': self.cookie, 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; Nexus Build/KOT49H)', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}) print req.text
def http_delete(path, method): path = path method = method headers = {"host": http_host, "Content-Type": "application/json"} authorization = sign(ak, sk, method, path, None, headers) print(authorization) headers["authorization"] = authorization headers["Method"] = method url = "http://" + http_host + path if PY3: request = urllib.request.Request(url, headers=headers, method=method) response = urllib.request.urlopen(request).read() else: req = urllib2.Request(url, headers=headers) req.get_method = lambda: method response = urllib2.urlopen(req).read() print("respone: ", response)
def http_post(path, method, body=None): path = path method = method dic = body or {} data = json.dumps(dic) headers = {"host": http_host, "Content-Type": "application/json"} authorization = sign(ak, sk, method, path, None, headers) print(authorization) headers["authorization"] = authorization headers["Method"] = method url = "http://" + http_host + path if PY3: data = bytes(data, 'utf-8') request = urllib.request.Request(url, headers=headers, method=method) response = urllib.request.urlopen(request, data).read() else: req = urllib2.Request(url, data, headers=headers) response = urllib2.urlopen(req).read() print("respone: ", response)
def get_h5_cookie(self, cookie): body = {"action": "to", "to": 'https%3A%2F%2Ftrain.m.jd.com'} sign = auth.sign('genToken', self.uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=genToken&clientVersion=5.8.0&build=42523&client=android&d_brand=&d_model=&osVersion=&screen=1280*720&partner=tencent&uuid=%s&area=1_2802_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( self.uuid, sign[1], sign[0]) logger.debug('POST %s' % url) headers = { 'Charset': 'UTF-8', 'Connection': 'close', 'Cookie': cookie, 'User-Agent': self.user_agent, 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } resp = requests.post(url, data='body=' + urllib.quote(json.dumps(body)) + '&', headers=headers) logger.debug('resp:%s' % resp.text) resp_body = resp.json() # {"code":"0","tokenKey":"AAEAMKMEfWAYh1fRAvE0siwbJrEjuCmaht3Of-dkAaMMpGzemdi7WsCeMn3EaUdejhCZvQ0","url":"http://un.m.jd.com/cgi-bin/app/appjmp"} url = 'http://un.m.jd.com/cgi-bin/app/appjmp?tokenKey=' + resp_body[ 'tokenKey'] + '&to=https%3A%2F%2Ftrain.m.jd.com&lbs=' logger.debug('GET:%s' % url) session = requests.session() resp = session.get( url, headers={ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'User-Agent': self.user_agent }, verify=False) return session.cookies.get_dict()
def http_get(path, method, params=None): path = path method = method dic = params or {} headers = {"host": http_host, "Content-Type": "application/json"} authorization = sign(ak, sk, method, path, dic, headers) headers["authorization"] = authorization headers["Method"] = method url = "http://" + http_host + path # url = "http://" + http_host + path + '?%s'%params if PY3: params = urllib.parse.urlencode(dic) url = "http://" + http_host + path + '?%s' % params request = urllib.request.Request(url, headers=headers) response = urllib.request.urlopen(request).read() else: params = urllib.urlencode(dic) url = "http://" + http_host + path + '?%s' % params req = urllib2.Request(url, headers=headers) response = urllib2.urlopen(req).read() print("respone: ", response)
def sign_test(self): sign_data = auth.sign( 'newUserInfo', base_data.get_random_number() + '-' + base_data.get_random_letter_number(12), '{"flag":"nickname"}') print sign_data
def phone_charge(): pool = redis.ConnectionPool(host='139.199.65.115', port=6379, db=0, password='******') r = redis.Redis(connection_pool=pool) while True: order_id = 0 success = 0 try: print 'redis brpop' result = r.brpop('order_platform:phone_charge:order', 5) if result: trade_no = result[1] logger.info('get trade no:%s' % trade_no) data = r.hgetall('order_platform:phone_charge:trade_no:%s' % trade_no) logger.info('get trade data:%s' % data) data['partner'] = json.loads(data['partner']) if not data: # trade data loss save_order({'trade_no': trade_no, 'status': u'数据丢失'}) logger.error('trade_no %s data loss' % trade_no) continue else: continue except Exception, e: logger.error(e.message) time.sleep(5) continue data['order_handler_time'] = str(datetime.datetime.now()) data['status'] = '正在下单' data['partner_price'] = '' data['callback_status'] = '' if data.has_key('order_id'): order_id = data['order_id'] else: order_id = save_order(data) uuid = base_data.get_random_number() + '-' + base_data.get_random_letter_number(12).lower() # data = {'mobile':'15763563256','parterner_id':'123654','amount':100,callback:''} mobile = des_encryption(data['mobile']) account = get_account(uuid) if not account: r.set('order_platform:switch:order_accpet', 0) data['status'] = '下单失败' data['err'] = '账号不足' callback_partner_and_save_order(data, 0, order_id) continue data['account'] = account pc_cookie = account['pc_cookie'] try: headers = { 'Charset': 'UTF-8', 'jdc-backup': account['cookie'], 'Connection': 'close', 'Cookie': account['cookie'], 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; Nexus Build/KOT49H)', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'} body = {"mobile": mobile} sign = auth.sign('searchPczPriceList', uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=searchPczPriceList&clientVersion=5.8.0&build=42523&client=android&d_brand=nubia&screen=1920*1080&partner=waps007&uuid=%s&area=1_0_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]) logger.info('get jd price') resp = requests.post(url, data='body=' + urllib.quote_plus(json.dumps(body)) + '&', headers=headers) resp = resp.json() data['providerName'] = resp['providerName'] data['areaName'] = resp['areaName'] data['partner_price'] = data['partner']['price'][resp['providerName']] # if data['providerName'] == u'移动': # data['partner_price'] = 98 # elif data['providerName'] == u'联通': # data['partner_price'] = 98 # else: # data['partner_price'] = 97 sku = filter(lambda s: s['facePrice'] == str(data['amount']), resp['skuList']) if len(sku) == 0: data['status'] = '数据丢失' callback_partner_and_save_order(data, 0, order_id) continue logger.info('get compon') sign = auth.sign('queryPczFavourableInfo', uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=queryPczFavourableInfo&clientVersion=5.8.0&build=42523&client=android&d_brand=nubia&screen=1920*1080&partner=waps007&uuid=%s&area=1_0_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]) resp = requests.post(url, data='body=' + urllib.quote_plus(json.dumps(body)) + '&', headers=headers) resp = resp.json() logger.debug(resp) if len(resp['dxqInfos']) > 0: data['discount'] = resp['dxqInfos'][0]['discount'] # 优惠金额 data['dxqids'] = resp['dxqInfos'][0]['id'] else: data['status'] = '没有优惠券' while True: try: logger.error('account compon not found,send to server') account['valid_message'] = '没有优惠券' account['valid'] = 0 resp = requests.post(base_data.JD_ACCOUNT_API_POST, json=account) logger.info('resp:%s' % resp.text) if resp.text == '1': logger.info('success') break else: time.sleep(60) continue except Exception, e: time.sleep(60) continue callback_partner_and_save_order(data, 0, order_id) continue data['jd_price'] = float(sku[0]['jdPrice']) / 100 - data['discount'] body = {"dxqids": data['dxqids'], "facePrice": data['amount'], "isBingding": "0", "isNote": "0", "jdPrice": str(data['jd_price']), "payType": "10", "type": "1", "contact": "false", "mobile": mobile} # data['jd_price'] = float(sku[0]['jdPrice']) / 100 # # "dxqids": "7929697981", # body = {"facePrice": data['amount'], "isBingding": "0", "isNote": "0", # "jdPrice": str(data['jd_price']), # "payType": "0", "type": "1", "contact": "false", "mobile": mobile} sign = auth.sign('submitPczOrder', uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=submitPczOrder&client=android&clientVersion=5.8.0&build=42523&osVersion=4.4.2&screen=1280*720&partner=tencent&uuid=%s&area=1_0_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]) body = 'body=' + urllib.quote_plus(json.dumps(body)) + '&' logger.debug('POST %s\n%s' % (url, body)) resp = requests.post(url, data=body, headers=headers) ret = resp.json() logger.debug(resp.text) if ret.has_key('orderId'): data['jd_order_id'] = ret['orderId'] data['money'] = ret['money'] data['status'] = u'下单成功' success = 1 logger.info('%s charge success,callback' % data['mobile']) else: data['status'] = u'下单失败' logger.error('%s charge faild\n%s' % (data['mobile'], traceback.format_exc()))
def test_get_wx_payinfo2(self): cookie = 'pin=jd_4c25331e9e318; wskey=AAFZFCJnAEApyqAxlSJkcJq5PpfyEQJP3AzScHZMPYnJil_OUyj_Nplm6EMUtplSPLrmze_4_A_dnePgOgpA3ZPb-PcAOnPL; whwswswws=' h5_cookie = { 'mobilev': 'touch', 'pt_key': 'app_openAAFZFCJrADDn-sSej1_DxCnX2huF62fiLmAr7HLgBgj8Of4jJFwXgzpPRI0qQOQfNsvRNQ0b95k', 'pwdt_id': 'jd_4c25331e9e318', 'sid': 'f4686d600dab33e26b0427afa298f5cw', 'guid': '2bc17003cc1916830d40e7d84c4d6523ae691c8936569e8cdac7479c22e02b07', 'pt_pin': 'jd_4c25331e9e318' } session = requests.session() resp = requests.get( 'https://train.m.jd.com/pay/goToPay?orderId=53087782937&trainOrderId=5751638&onlinePayFee=19.50', headers={ 'Charset': 'UTF-8', 'Connection': 'close', 'Cookie': 'mobilev=touch,pt_key=app_openAAFZFCJrADDn-sSej1_DxCnX2huF62fiLmAr7HLgBgj8Of4jJFwXgzpPRI0qQOQfNsvRNQ0b95k,pwdt_id=jd_4c25331e9e318,sid=f4686d600dab33e26b0427afa298f5cw,guid=2bc17003cc1916830d40e7d84c4d6523ae691c8936569e8cdac7479c22e02b07,pt_pin=jd_4c25331e9e318', 'User-Agent': 'jdapp;android;6.0.0;4.4.2;863175026618021-a8a6681e316b;network/wifi;osp/android;apv/6.0.0;osv/4.4.2;uid/863175026618021-a8a6681e316b;pv/210.81;psn/863175026618021-a8a6681e316b|211;psq/25;ref/;pap/JA2015_311210|6.0.0|ANDROID 4.4.2;usc/direct;ucp/-;umd/none;utr/-;adk/;ads/;jdv/;Mozilla/5.0 (Linux; Android 4.4.2; NX507J Build/KVT49L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043124 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, verify=False) # ,allow_redirects=False pay_url = resp.url query = pay_url[pay_url.index('?') + 1:].split('&') payload = {} for q in query: q = q.split('=') payload[q[0]] = q[1] payload['appId'] = 'jd_android_app4' # payload['payId']='4d5f1ae1294a40f3aa4fa1d749e8d1a7' # print pay_url,query,payload headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Accept': '*/*', 'Origin': 'https://pay.m.jd.com', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'jdapp;android;6.0.0;6.0;861012032753710-f823b2dbaddc;network/wifi;osp/android;apv/6.0.0;osv/6.0;uid/861012032753710-f823b2dbaddc;pv/1.45;psn/861012032753710-f823b2dbaddc|3;psq/6;ref/;pap/JA2015_311210|6.0.0|ANDROID 6.0;usc/direct;ucp/-;umd/none;utr/-;adk/;ads/;jdv/;hasUPPay/0;Mozilla/5.0 (Linux; Android 6.0; CAM-AL00 Build/HONORCAM-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043220 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': 'https://pay.m.jd.com/cpay/index.html?appId=jd_android_app4&payId=' + payload['payId'], 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,en-US;q=0.8', 'Cookie': cookie } resp = requests.post('https://pay.m.jd.com/newpay/index.action', data='appId=jd_android_app4&payId=' + payload['payId'] + '&_format_=JSON', headers=headers) print resp.text uuid = base_data.get_random_number( ) + '-' + base_data.get_random_letter_number(12).lower() headers = { 'Accept-Encoding': 'gzip,deflate', 'Cookie': cookie, 'Charset': 'UTF-8', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.2.2; GT-P5210 Build/JDQ39E)' } print json.dumps(payload) sign = auth.sign('weixinPay', uuid, json.dumps(payload)) resp = requests.post( url= 'https://pay.m.jd.com/index.action?functionId=weixinPay&clientVersion=5.8.0&build=42523&client=android&d_brand=Xiaomi&d_model=Mi4&osVersion=4.2.2&screen=1440*810&partner=goapk001&uuid=%s&area=19_1709_20093_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( # url = 'http://api.m.jd.com/client.action?functionId=configCouponList&clientVersion=5.8.0&build=42523&client=android&d_brand=&d_model=&osVersion=&screen=1280*720&partner=tencent&uuid=%s&area=1_2802_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]), data='body=%7B%22payId%22%3A%22' + payload['payId'] + '%22%2C%22appId%22%3A%22jd_android_app4%22%7D&', # 'body=' + urllib.quote(json.dumps(payload))+ '&', headers=headers) print resp.text
def test_get_wx_payinfo(self): cookie = 'pin=jd_417181296b3ba; wskey=AAFZCEPFAECu4cCwW_BItToNjJMdjva2TkDa-NfZ8lXY9Tc71Ez8teFvoHKgIPYis4xLutBE8792x58wEkTcT2zhMnEVSR-w; whwswswws=' h5_cookie = { 'mobilev': 'touch', 'pt_key': 'app_openAAFZCEPFADC0pTiZdMxn3QlFk3jh8Pr60qhjMOO07np7zyLdJmKX1QuNA6sF-SWkKULi6p35kk8', 'pwdt_id': 'jd_417181296b3ba', 'sid': '07713da596d5a6c7c0aaa19ebfff3b7w', 'guid': '5b317f5a3d5b7af09d4ba69b901966e066bfd06b1b35a64e5b95ad5d264e41aa', 'pt_pin': 'jd_417181296b3ba' } resp = requests.get( 'https://train.m.jd.com/pay/goToPay?orderId=51990280826&trainOrderId=5567188&onlinePayFee=18.5', headers={ 'Charset': 'UTF-8', 'Connection': 'close', 'Cookie': 'mobilev=touch,pt_key=app_openAAFZCEPFADC0pTiZdMxn3QlFk3jh8Pr60qhjMOO07np7zyLdJmKX1QuNA6sF-SWkKULi6p35kk8,pwdt_id=jd_417181296b3ba,sid=07713da596d5a6c7c0aaa19ebfff3b7w,guid=5b317f5a3d5b7af09d4ba69b901966e066bfd06b1b35a64e5b95ad5d264e41aa,pt_pin=jd_417181296b3ba', 'Upgrade-Insecure-Requests:': '1', 'User-Agent': 'JD4iPhone/134623 (iPhone; iOS 8.1.3; Scale/2.00)', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, verify=False) # ,allow_redirects=False pay_url = resp.url query = pay_url[pay_url.index('?') + 1:].split('&') payload = {} for q in query: q = q.split('=') payload[q[0]] = q[1] print pay_url, query, payload uuid = base_data.get_random_number( ) + '-' + base_data.get_random_letter_number(12).lower() headers = { 'Accept-Encoding': 'gzip,deflate', 'jdc-backup': cookie, 'Cookie': cookie, 'Charset': 'UTF-8', 'Connection': 'Keep-Alive', 'Cache-Control': 'no-cache', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'User-Agent': 'JD4iPhone/134623 (iPhone; iOS 8.1.3; Scale/2.00)' } # payload['appId']='jd_iphone_app4' print json.dumps(payload) sign = auth.sign('weixinPay', uuid, json.dumps(payload)) resp = requests.post( url= 'http://api.m.jd.com/client.action?functionId=weixinPay&clientVersion=5.8.0&build=42523&client=android&d_brand=nubia&d_model=NX507J&osVersion=4.4.2&screen=1920*1080&partner=jingdong2&uuid=%s&area=1_2802_2821_0&networkType=wifi&st=%s&sign=%s&sv=111' % ( # url = 'http://api.m.jd.com/client.action?functionId=configCouponList&clientVersion=5.8.0&build=42523&client=android&d_brand=&d_model=&osVersion=&screen=1280*720&partner=tencent&uuid=%s&area=1_2802_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]), data='body=' + urllib.quote(json.dumps(payload)) + '&', headers=headers) # resp = requests.post( # url='http://pay.m.jd.com/index.action?functionId=weixinPay', # data='body=' + urllib.quote(json.dumps(payload)) + 'adid=9A72E17A-8D8C-4877-A781-35CEBB8C6E38&area=19_1607_3155_0&build=134623&client=apple&clientVersion=5.8.0&d_brand=apple&d_model=iPhone7%2C2&isBackground=N&networkType=wifi&networklibtype=JDNetworkBaseAF&openudid=dc8015f619f669cf0008bc9ea2e98f5908eec7c9&osVersion=8.1.3&partner=pp601&screen=750%2A1334&'+'uuid=%s&st=%s&sign=%s&sv=100'% ( # # url = 'http://api.m.jd.com/client.action?functionId=configCouponList&clientVersion=5.8.0&build=42523&client=android&d_brand=&d_model=&osVersion=&screen=1280*720&partner=tencent&uuid=%s&area=1_2802_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( # uuid, sign[1], sign[0]), # headers=headers) print resp.json()
def sync_status_from_jd(): pool = redis.ConnectionPool(host='139.199.65.115', port=6379, db=0, password='******') r = redis.Redis(connection_pool=pool) while True: retry = 0 try: print 'redis brpop' result = r.brpop('order_platform:phone_charge:order_pay_success', 5) if result: resp = result[1] logger.info('get order:%s' % resp, program='sync_status_from_jd') # resp = requests.get(base_data.ORDER_API_GET + id) # resp = resp.json() if (resp): order = json.loads(resp) order_sync_jd_status_time = str(datetime.datetime.now()) cookie = order['account']['cookie'] logger.info('get status', order['trade_no'], 'sync_status_from_jd') uuid = base_data.get_random_number() + '-' + base_data.get_random_letter_number(12).lower() headers = { 'Charset': 'UTF-8', 'jdc-backup': cookie, 'Connection': 'close', 'Cookie': cookie, 'User-Agent': 'okhttp/3.2.0', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'} body = {"orderId": order['jd_order_id']} sign = auth.sign('queryPczOrderInfo', uuid, json.dumps(body)) url = 'http://api.m.jd.com/client.action?functionId=queryPczOrderInfo&clientVersion=5.8.0&build=42523&client=android&screen=1920*1080&partner=waps007&uuid=%s&area=1_0_0_0&networkType=wifi&st=%s&sign=%s&sv=122' % ( uuid, sign[1], sign[0]) body = 'body=' + urllib.quote_plus(json.dumps(body)) + '&' while True: resp = requests.post(url, data=body, headers=headers) ret = resp.json() logger.debug('get jd response:%s' % resp.text, order['trade_no'], 'sync_status_from_jd') # print ret jd_order_status = ret['rechargeOrder']['orderStatusName'] logger.info(jd_order_status, order['trade_no'], 'sync_status_from_jd') if jd_order_status == u'充值成功': logger.info('send to queue order_platform:phone_charge:order_success', order['trade_no'], 'sync_status_from_jd') order['order_sync_jd_status_time'] = order_sync_jd_status_time r.lpush('order_platform:phone_charge:order_success', json.dumps(order)) break elif jd_order_status == u'等待付款' or u'充值失败' in jd_order_status: logger.info( 'lpush %s to queue order_platform:phone_charge:order_faild' % order['trade_no'], order['trade_no'], 'sync_status_from_jd') r.lpush('order_platform:phone_charge:order_faild', json.dumps( {'trade_no': order['trade_no'], 'order_faild_time': order_sync_jd_status_time})) break else: pay_callback_time = int( time.mktime(time.strptime(order['pay_callback_time'], '%Y-%m-%d %H:%M:%S'))) t = int(time.time()) if t - pay_callback_time < 15 * 60: retry += 1 if retry < 2: time.sleep(5) # time.sleep(2) continue else: logger.info( 'timeout,lpush %s to queue order_platform:phone_charge:order_pay_success' % order['trade_no'], order['trade_no'], 'sync_status_from_jd') r.lpush('order_platform:phone_charge:order_pay_success', order['trade_no']) break else: logger.info('charge timeout and need customer service verifies,set status', order['trade_no'], 'sync_status_from_jd') resp = requests.post(base_data.ORDER_SETSTATUS_API_POST, data={'order_id': order['trade_no'], 'status': '超时待人工核实'}) logger.info(resp.text, order['trade_no'], 'sync_status_from_jd') break else: logger.error('cant find order %s' % id, program='sync_status_from_jd') else: continue except Exception, e: logger.error(e.message, program='sync_status_from_jd') time.sleep(5) continue