微信支付-公众平台
頁面按鈕顯示:
<!--支付確認按鈕--><article class="btn-group"><a href="javascript:void(0);" click='wx_pay()' class="btn btn-w100 f28">下一步</a></article>點擊支付:
var wx_pay = function(){var ordernum=$("#hid_ordernum").val();var ip=$("#hid_ip").val();var ra=$('input:radio[name="pay-type"]:checked').val();if(ra=="weixin"){var open_id = "{{open_id}}";if(open_id.length <= 0 ){//如果用戶還沒有微信給的open_id 就去獲取一個 這個是靜默授權獲取$.get("/wechat/weixin_snsapi_base/"+ordernum,{},function(data){window.location.href = data.wx_redirect_url;})}else{$.ajax({type: "POST",url: "/wechat/unified_order",data: {'ordernum':ordernum,"ip":ip},success:function (data) {if(data["code"]=="SUCCESS"){//調起微信支付onBridgeReady(data["dict"]);}else{$("#div_box_message").html(data['msg']);$("#div_show_box").show();};}});}}else {$("#div_box_message").html("請選擇你支付方式!");$("#div_show_box").show();return false;}}支付的首先調用微信統一下單接口,微信那邊創建預支付訂單:
@wechat.route('/unified_order', methods=['POST']) def unified_order():'''統一下單接口 price, time_start, time_out,artwork_id'''ip = request.form.get("ip") if request.form.get("ip") else webutil.request_ip()ordernum = request.form.get("ordernum")if not ordernum:return jsonify({"code": -1})open_id = webutil.session_get_user_open_id(ordernum)# print '1----', open_id# if not open_id:# # 用戶沒有微信授權先授權獲取open_id# url = open_weixin_snsapi_base(ordernum, ip)# return redirect(url)# print '2----', open_id# print '3----', open_id# print '4----', open_idorder = Orders.query.filter_by(ordernum=ordernum).first()price = order.order_pricetime_start = order.created_ontime_out = order.created_onartwork_id = order.artwork_idres = _unified_order(ordernum, price, ip, time_start,time_out, artwork_id, open_id)# 組裝返回值code = "FAIL"msg = res['return_msg']dict = {}if res["return_code"] == "SUCCESS" and res['result_code'] == "SUCCESS":dict['appId'] = res['appid']dict['timeStamp'] = '{}'.format(int(time.time()))dict['nonceStr'] = uuid.uuid4().hexdict['package'] = "prepay_id=%s" % res['prepay_id']dict['signType'] = "MD5"dict['paySign'] = __get_sign(dict)code = "SUCCESS"elif res["return_code"] == "SUCCESS":msg = res['err_code_des']print dictreturn jsonify({"code": code, "msg": msg, "dict": dict}) def _unified_order(ordernum, price, ip, time_start, time_out,artwork_id, openid):"""統一下單接口公眾賬號ID appid 是 String(32) wxd678efh567hg6787 微信支付分配的公眾賬號ID(企業號corpid即為此appId)商戶號 mch_id 是 String(32) 1230000109 微信支付分配的商戶號設備號 device_info 否 String(32) 013467007045764 自定義參數,可以為終端設備號(門店號或收銀設備ID),PC網頁或公眾號內支付可以傳"WEB"隨機字符串 nonce_str 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 隨機字符串,長度要求在32位以內。推薦隨機數生成算法簽名 sign 是 String(32) C380BEC2BFD727A4B6845133519F3AD6 通過簽名算法計算得出的簽名值,詳見簽名生成算法簽名類型 sign_type 否 String(32) HMAC-SHA256 簽名類型,默認為MD5,支持HMAC-SHA256和MD5。商品描述 body 是 String(128) 騰訊充值中心-QQ會員充值 商品簡單描述,該字段請按照規范傳遞,具體請見參數規定商品詳情 detail 否 String(6000)附加數據 attach 否 String(127) 深圳分店 附加數據,在查詢API和支付通知中原樣返回,可作為自定義參數使用。商戶訂單號 out_trade_no 是 String(32) 20150806125346 商戶系統內部訂單號,要求32個字符內、且在同一個商戶號下唯一。 詳見商戶訂單號標價幣種 fee_type 否 String(16) CNY 符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,詳細列表請參見貨幣類型標價金額 total_fee 是 Int 88 訂單總金額,單位為分,詳見支付金額終端IP spbill_create_ip 是 String(16) 123.12.12.123 APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。交易起始時間 time_start 否 String(14) 20091225091010 訂單生成時間,格式為yyyyMMddHHmmss,如2009年12月25日9點10分10秒表示為20091225091010。其他詳見時間規則交易結束時間 time_expire 否 String(14) 20091227091010訂單失效時間,格式為yyyyMMddHHmmss,如2009年12月27日9點10分10秒表示為20091227091010。其他詳見時間規則注意:最短失效時間間隔必須大于5分鐘商品標記 goods_tag 否 String(32) WXG 商品標記,使用代金券或立減優惠功能時需要的參數,說明詳見代金券或立減優惠通知地址 notify_url 是 String(256) http://www.weixin.qq.com/wxpay/pay.php 異步接收微信支付結果通知的回調地址,通知url必須為外網可訪問的url,不能攜帶參數。交易類型 trade_type 是 String(16) JSAPI 取值如下:JSAPI,NATIVE,APP等,說明詳見參數規定商品ID product_id 否 String(32) 12235413214070356458058 trade_type=NATIVE時(即掃碼支付),此參數必傳。此參數為二維碼中包含的商品ID,商戶自行定義。指定支付方式 limit_pay 否 String(32) no_credit 上傳此參數no_credit--可限制用戶不能使用信用卡支付用戶標識 openid 否 String(128) oUpF8uMuAJO_M2pxb1Q9zNjWeS6o trade_type=JSAPI時(即公眾號支付),此參數必傳,此參數為微信用戶在商戶對應appid下的唯一標識。openid如何獲取,可參考【獲取openid】。企業號請使用【企業號OAuth2.0接口】獲取企業號內成員userid,再調用【企業號userid轉openid接口】進行轉換'device_info': 'WEB',"sign_type": "MD5","""return_url = os.path.join("http://", DOMAIN_NAME, "wechat/wx_notify")dict = {'appid': appid, 'mch_id': "1435556302","nonce_str": uuid.uuid4().hex,"body": "詩藝-藝術品","out_trade_no": ordernum, "total_fee": int(price * 100),"spbill_create_ip": ip, "notify_url": return_url,"trade_type": "JSAPI","openid": openid}# if time_out and time_start:# dict["time_start"] = time_start# dict["time_out"] = time_start + timedelta(minutes=30)if artwork_id:dict["product_id"] = artwork_id# 生成簽名dict['sign'] = __get_sign(dict)print dict, '-----'# dict轉換為xml格式xml = __json_to_xml(dict)url = "https://api.mch.weixin.qq.com/pay/unifiedorder"req = urllib2.Request(url=url, headers={'Content-Type': 'text/xml'}, data=str(xml))f = urllib2.urlopen(req)res = f.read()res = __xml_to_json(res)return res.get("xml")統一下單完成之后調起微信支付:
//jsapi微信支付function onBridgeReady(data){WeixinJSBridge.invoke('getBrandWCPayRequest', data,function(res){if(res.err_msg == "get_brand_wcpay_request:ok") {//跳轉到支付成功界面window.location.href="/order/pay_finish";} // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回 ok,但并不保證它絕對可靠。else{//alert(res.err_msg);}});}
微信支付就完成了,基本會成功,但是這里說不保證絕對可靠,所以需要調用微信另一個用來查詢訂單支付是否成功接口。
?
轉載于:https://www.cnblogs.com/2014-02-17/p/6936805.html
總結
- 上一篇: 微信小程序新增推广功能,支持自定义关键词
- 下一篇: Activiti邮件任务