1. 程式人生 > >如何調通微信支付及微信發貨通知介面(Js API)

如何調通微信支付及微信發貨通知介面(Js API)

        <script src="/portal/apps/wd/vip/js/md5.js"></script>
        <script src="/portal/apps/wd/vip/js/sha1.js"></script>
        <script Language="javascript">
var curSign="";
var curTime="";
var orderNo="";
            //輔助函式
            function Trim(str,is_global)
            {
                var result;
                result = str.replace(/(^\s+)|(\s+$)/g,"");
                if(is_global.toLowerCase()=="g") result = result.replace(/\s/g,"");
                return result;
            }
            function clearBr(key)
            {
                key = Trim(key,"g");
                key = key.replace(/<\/?.+?>/g,"");
                key = key.replace(/[\r\n]/g, "");
                return key;
            }
            
            //獲取隨機數
            function getANumber()
            {
                var date = new Date();
                var times1970 = date.getTime();
                var times = date.getDate() + "" + date.getHours() + "" + date.getMinutes() + "" + date.getSeconds();
                var encrypt = times * times1970;
                if(arguments.length == 1)
{
orderNo = arguments[0] + encrypt;
                    return orderNo;
                }else{
orderNo = encrypt;
                    return orderNo;
                }
                
            }
            
            
            //以下是package組包過程:
            
            var oldPackageString;//記住package,方便最後進行整體簽名時取用
            
            function getPartnerId()
            {
                return document.form1.partnerId.value;
            }
            
            function getPartnerKey()
            {
                return "8934e7d15453e97507ef794cf7b0519d";////申請時獲取的商戶partner key

          }
            
            
            
            function getPackage()
            {
                var banktype = "WX";
                var body = document.form1.body.value;//商品名稱資訊,這裡由測試網頁填入。
                var fee_type = "1";//費用型別,這裡1為預設的人民幣
                 
                var input_charset = "UTF-8";//改為UTF-8,現在可以用UTF-8
                
var notify_url = "http://www.iartwall.com/portal/apps/b2c/weixinPay.jsp";//這個地址是支付成功後呼叫的,業務系統需要在這裡截獲返回的引數,寫到自己的業務系統中以記錄此訂單是否成功付款,及付款銀行資訊等很多內容,詳見支付介面文件。
                var out_trade_no = ""+getANumber();//訂單號,商戶需要保證該欄位對於本商戶的唯一性
                var partner = getPartnerId();//測試商戶號
 
                var spbill_create_ip = "<%=request.getRemoteHost()%>";//"127.0.0.1";//使用者瀏覽器的ip,這個需要在前端獲取。這裡使用127.0.0.1測試值
                var total_fee = document.form1.totalFee.value;//總金額。
                var partnerKey = getPartnerKey();//這個值和以上其他值不一樣是:簽名需要它,而最後組成的傳輸字串不能含有它。這個key是需要商戶好好儲存的。
              
                //首先第一步:對原串進行簽名,注意這裡不要對任何欄位進行編碼。這裡是將引數按照key=value進行字典排序後組成下面的字串,在這個字串最後拼接上key=XXXX。由於這裡的欄位固定,因此只需要按照這個順序進行排序即可。
                var signString = "bank_type="+banktype+"&body="+body+"&fee_type="+fee_type+"&input_charset="+input_charset+"&notify_url="+notify_url+"&out_trade_no="+out_trade_no+"&partner="+partner+"&spbill_create_ip="+spbill_create_ip+"&total_fee="+total_fee+"&key="+partnerKey;
                
                var md5SignValue =  ("" + CryptoJS.MD5(signString)).toUpperCase();
                //然後第二步,對每個引數進行url轉碼,如果您的程式是用js,那麼需要使用encodeURIComponent函式進行編碼。
               
                
                banktype = encodeURIComponent(banktype);
                body=encodeURIComponent(body);
                fee_type=encodeURIComponent(fee_type);
                input_charset = encodeURIComponent(input_charset);
                notify_url = encodeURIComponent(notify_url);
                out_trade_no = encodeURIComponent(out_trade_no);
                partner = encodeURIComponent(partner);
                spbill_create_ip = encodeURIComponent(spbill_create_ip);
                total_fee = encodeURIComponent(total_fee);
                
                //然後進行最後一步,這裡按照key=value除了sign外進行字典序排序後組成下列的字串,最後再串接sign=value
                var completeString = "bank_type="+banktype+"&body="+body+"&fee_type="+fee_type+"&input_charset="+input_charset+"&notify_url="+notify_url+"&out_trade_no="+out_trade_no+"&partner="+partner+"&spbill_create_ip="+spbill_create_ip+"&total_fee="+total_fee;
                completeString = completeString + "&sign="+md5SignValue;
                 
                
                oldPackageString = completeString;//記住package,方便最後進行整體簽名時取用
                 
                return completeString;
            }
            
            
            //下面是app進行簽名的操作:
            
            var oldTimeStamp ;//記住timestamp,避免簽名時的timestamp與傳入的timestamp時不一致
            var oldNonceStr ; //記住nonceStr,避免簽名時的nonceStr與傳入的nonceStr不一致
            
            function getAppId()
            {
// alert('getAppId start......')
                return document.form1.appId.value;
            }
            
            function getAppKey()
            {
                return "2WU。。。。。。。JObvBqfs";//很長很長,支付專用簽名串PaySignKey,如果沒有,跟微信客服索取(得走完微信支付審批流程)。
            }
            
            
            
            function getTimeStamp()
            {

                var timestamp=new Date().getTime();
                var timestampstring = timestamp.toString();//一定要轉換字串
                oldTimeStamp = timestampstring;
curTime = timestampstring;
        return timestampstring;
          }
            
            function getNonceStr()
            {
 
                var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
                var maxPos = $chars.length;
                var noceStr = "";
                for (i = 0; i < 32; i++) {
                    noceStr += $chars.charAt(Math.floor(Math.random() * maxPos));
                }
                oldNonceStr = noceStr;
//alert("rand:"+noceStr);
                return noceStr;
            }
            
            function getSignType()
            {
        return "SHA1";
            }
            
            function getSign()
            {
        var app_id = getAppId().toString();
                var app_key = getAppKey().toString();
                var nonce_str = oldNonceStr;
                var package_string = oldPackageString;
                var time_stamp = oldTimeStamp;
                //第一步,對所有需要傳入的引數加上appkey作一次key=value字典序的排序
                var keyvaluestring = "appid="+app_id+"&appkey="+app_key+"&noncestr="+nonce_str+"&package="+package_string+"&timestamp="+time_stamp;
                sign = CryptoJS.SHA1(keyvaluestring).toString();
//alert(sign);
curSign = sign;
                return sign;
            }


  function getSign2(appId,appKey,openId,transId,outTradeNo,deliver_timestamp)
            {
        //var app_id = getAppId().toString();
                //var app_key = getAppKey().toString();
 
                //var nonce_str = oldNonceStr;
                //var package_string = oldPackageString;
                //var time_stamp = oldTimeStamp;
                //第一步,對所有需要傳入的引數加上appkey作一次key=value字典序的排序
                var keyvaluestring = "appid="+appId+"&appkey="+appKey+"&deliver_msg=ok"+"&deliver_status=1"+"&deliver_timestamp="+deliver_timestamp+"&openid="+openId+"&out_trade_no="+outTradeNo+"&transid="+transId;
        var sign2 = CryptoJS.SHA1(keyvaluestring).toString();
        return sign2;
            }
            
            
            
            
            </script>
        
    
        
        <style>
            
            
            body { margin:0;padding:0;background:#eae9e6; }
            body,p,table,td,th { font-size:14px;font-family:helvetica,Arial,Tahoma; }
            h1 { font-family:Baskerville,HelveticaNeue-Bold,helvetica,Arial,Tahoma; }
            a { text-decoration:none;color:#385487;}
            
            
            .container {  }
            .title { }
            #content {padding:30px 20px 20px;color:#111;box-shadow:0 1px 4px #ccc; background:#f7f2ed;  }
            .seeAlso { padding:15px 20px 30px; }
            
            .headpic div { margin:20px 0 0;}
            .headpic img { display:block;}
            
            .title h1 { font-size:22px;font-weight:bold;padding:0;margin:0;line-height:1.2;color:#1f1f1f; }
            .title p { color:#aaa;font-size:12px;margin:5px 0 0;padding:0;font-weight:bold;}
            .pic { margin:20px 0; }
            .articlecontent img { display:block;clear:both;box-shadow:0px 1px 3px #999; margin:5px auto;}
            .articlecontent p { text-indent: 2em; font-family:Georgia,helvetica,Arial,Tahoma;line-height:1.4; font-size:16px; margin:20px 0;  }
            
            
            .seeAlso h3 { font-size:16px;color:#a5a5a5;}
            .seeAlso ul { margin:0;padding:0; }
            .seeAlso li {  font-size:16px;list-style-type:none;border-top:1px solid #ccc;padding:2px 0;}
            .seeAlso li a { border-bottom:none;display:block;line-height:1.1; padding:13px 0; }
            
            .clr{ clear:both;height:1px;overflow:hidden;}
            
            
            .fontSize1 .title h1 { font-size:20px; }
            .fontSize1 .articlecontent p {  font-size:14px; }
            .fontSize1 .weibo .nickname,.fontSize1 .weibo .comment  { font-size:11px; }
            .fontSize1 .moreOperator { font-size:14px; }
            
            .fontSize2 .title h1 { font-size:22px; }
            .fontSize2 .articlecontent p {  font-size:16px; }
            .fontSize2 .weibo .nickname,.fontSize2 .weibo .comment  { font-size:13px; }
            .fontSize2 .moreOperator { font-size:16px; }
            
            .fontSize3 .title h1 { font-size:24px; }
            .fontSize3 .articlecontent p {  font-size:18px; }
            .fontSize3 .weibo .nickname,.fontSize3 .weibo .comment  { font-size:15px; }
            .fontSize3 .moreOperator { font-size:18px; }
            
            .fontSize4 .title h1 { font-size:26px; }
            .fontSize4 .articlecontent p {  font-size:20px; }
            .fontSize4 .weibo .nickname,.fontSize4 .weibo .comment  { font-size:16px; }
            .fontSize4 .moreOperator { font-size:20px; }
            
            .jumptoorg { display:block;margin:16px 0 16px; }
            .jumptoorg a {  }
            
            .moreOperator a { color:#385487; }
            
            .moreOperator .share{ border-top:1px solid #ddd; }
            
            .moreOperator .share a{ display:block;border:1px solid #ccc;border-radius:4px;margin:20px 0;border-bottom-style:solid;background:#f8f7f1;color:#000; }
            
            .moreOperator .share a span{ display:block;padding:10px 10px;border-radius:4px;text-align:center;border-top:1px solid #eee;border-bottom:1px solid #eae9e3;font-weight:bold; }
            
            .moreOperator .share a:hover,
            .moreOperator .share a:active { background:#efedea; }
            @media only screen and (-webkit-min-device-pixel-ratio: 2) {
            }
            </style>
        <script language="javascript">
            function auto_remove(img){
                div=img.parentNode.parentNode;div.parentNode.removeChild(div);
                img.onerror="";
                return true;
            }
            
            function changefont(fontsize){
                if(fontsize < 1 || fontsize > 4)return;
                $('#content').removeClass().addClass('fontSize' + fontsize);
            }