如何調通微信支付及微信發貨通知介面(Js API)
阿新 • • 發佈:2019-02-14
<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+"¬ify_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+"¬ify_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+"×tamp="+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);
}
<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+"¬ify_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+"¬ify_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+"×tamp="+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);
}