楼主公司是做微信周边产品开发的,最近公司接到一个case,跟客户公司接口对接,并实现微信支付。楼主可是从没接触过微信支付,当时心里感觉好高大上,能搞定么?马上忽悠来客户的公众平台帐号、密码上去看微信支付文档。
公众号支付有2种支付方式:
JS API 支付:是指用户打开图文消息或者扫描二维码,在微信内置浏览器打开网页进行的支付。商户网页前端通过使用微信提供的 JS API,调用微信支付模块。这种方式,适合
需要在商户网页进行选购下单的购买流程。
Native(原生)支付:是指商户组成符合 Native(原生)支付规则的 URL 链接,用户可通过点击该链接或者扫描对应的二维码直接进入微信支付模块(微信客户端界面),即可
进行支付。这种方式,适合无需选购直接支付的购买流程。
以上两种方式最大的区别是:是否需要经过网页调用!
交互原理:
客户是想做一个手机端的商城,所以选择JS API支付,通过网页调取微信支付。。
楼主第一次看过文档后,什么“支付签名(paySign)”啊,什么“package包”啊等等一些参数,反正似懂非懂的样子。楼主这人比较懒,不然也不会注册3年了,也就写了这么篇不入流的文章,楼主想啊像这些个大公司开放个啥接口的肯定会有demo。楼主的运气还真不错(PS:楼主可是为福利事业贡献了不少哦,咋就没这运气?),还真让楼主找到了,那心情肯定是比不上中500W的,嘿嘿。
<!DOCTYPE html>
<html>
<head>
<title>公众号支付测试网页</title>
<script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/jquery.js"></script>
<script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/lazyloadv3.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js"></script>
<script Language="javascript">
//辅助函数
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){
return arguments[0] + encrypt;
}else{
return encrypt;
}
}
//以下是package组包过程:
var oldPackageString;//记住package,方便最后进行整体签名时取用
function getPartnerId()
{
return document.form1.partnerId.value;
}
function getPartnerKey()
{
return "8934e7d15453e97507ef794cf7b0519d";
}
function getPackage()
{
var banktype = "WX";
var body = document.form1.body.value;//商品名称信息,这里由测试网页填入。
var fee_type = "1";//费用类型,这里1为默认的人民币
var input_charset = "GBK";//字符集,这里将统一使用GBK
var notify_url = "http://www.qq.com";//支付成功后将通知该地址
var out_trade_no = ""+getANumber();//订单号,商户需要保证该字段对于本商户的唯一性
var partner = getPartnerId();//测试商户号
var spbill_create_ip = "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()
{
return document.form1.appId.value;
}
function getAppKey()
{
return "2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRATv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn";
}
function getTimeStamp()
{
var timestamp=new Date().getTime();
var timestampstring = timestamp.toString();//一定要转换字符串
oldTimeStamp = 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;
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();
return sign;
}
</script>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;" />
<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);
}
// 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。
document.addEventListener(‘WeixinJSBridgeReady‘, function onBridgeReady() {
//公众号支付
jQuery(‘a#getBrandWCPayRequest‘).click(function(e){
WeixinJSBridge.invoke(‘getBrandWCPayRequest‘,{
"appId" : getAppId(), //公众号名称,由商户传入
"timeStamp" : getTimeStamp(), //时间戳
"nonceStr" : getNonceStr(), //随机串
"package" : getPackage(),//扩展包
"signType" : getSignType(), //微信签名方式:1.sha1
"paySign" : getSign() //微信签名
},function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {}
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
//因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
});
});
WeixinJSBridge.log(‘yo~ ready.‘);
}, false)
if(jQuery){
jQuery(function(){
var width = jQuery(‘body‘).width() * 0.87;
jQuery(‘img‘).error(function(){
var self = jQuery(this);
var org = self.attr(‘data-original1‘);
self.attr("src", org);
self.error(function(){
auto_remove(this);
});
});
jQuery(‘img‘).each(function(){
var self = jQuery(this);
var w = self.css(‘width‘);
var h = self.css(‘height‘);
w = w.replace(‘px‘, ‘‘);
h = h.replace(‘px‘, ‘‘);
if(w <= width){
return;
}
var new_w = width;
var new_h = Math.round(h * width / w);
self.css({‘width‘ : new_w + ‘px‘, ‘height‘ : new_h + ‘px‘});
self.parents(‘div.pic‘).css({‘width‘ : new_w + ‘px‘, ‘height‘ : new_h + ‘px‘});
});
});
}
</script>
</head>
<body>
<form name="form1" target="_blank">
<table border="1">
<TR><th>公众号ID</th> <th><INPUT value="wxf8b4f85f3a794e77" name="appId" id="1"></th>
<tr><th>商户ID</th><th><INPUT value="1900000109" name="partnerId" id="2"></th>
<TR><th>总金额</th><th><INPUT value=1 name="totalFee" id="3"></th>
<TR><th>商品名</th><th><INPUT value="江诗丹顿" name="body" id="4"></th>
</table>
</form>
<div class="WCPay">
<a id="getBrandWCPayRequest" href="javascript:void(0);"><h1 class="title">提交</h1></a>
</div>
</body>
</html>
<!DOCTYPE html> <html> <head> <title>公众号支付测试网页</title> <script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/jquery.js"></script> <script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/lazyloadv3.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js"></script> <script Language="javascript"> //辅助函数 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){ return arguments[0] + encrypt; }else{ return encrypt; } } //以下是package组包过程: var oldPackageString;//记住package,方便最后进行整体签名时取用 function getPartnerId() { return document.form1.partnerId.value; } function getPartnerKey() { return "8934e7d15453e97507ef794cf7b0519d"; } function getPackage() { var banktype = "WX"; var body = document.form1.body.value;//商品名称信息,这里由测试网页填入。 var fee_type = "1";//费用类型,这里1为默认的人民币 var input_charset = "GBK";//字符集,这里将统一使用GBK var notify_url = "http://www.qq.com";//支付成功后将通知该地址 var out_trade_no = ""+getANumber();//订单号,商户需要保证该字段对于本商户的唯一性 var partner = getPartnerId();//测试商户号 var spbill_create_ip = "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() { return document.form1.appId.value; } function getAppKey() { return "2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRATv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn"; } function getTimeStamp() { var timestamp=new Date().getTime(); var timestampstring = timestamp.toString();//一定要转换字符串 oldTimeStamp = 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; 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(); return sign; } </script> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;" /> <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); } // 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。 document.addEventListener(‘WeixinJSBridgeReady‘, function onBridgeReady() { //公众号支付 jQuery(‘a#getBrandWCPayRequest‘).click(function(e){ WeixinJSBridge.invoke(‘getBrandWCPayRequest‘,{ "appId" : getAppId(), //公众号名称,由商户传入 "timeStamp" : getTimeStamp(), //时间戳 "nonceStr" : getNonceStr(), //随机串 "package" : getPackage(),//扩展包 "signType" : getSignType(), //微信签名方式:1.sha1 "paySign" : getSign() //微信签名 },function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 //因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。 }); }); WeixinJSBridge.log(‘yo~ ready.‘); }, false) if(jQuery){ jQuery(function(){ var width = jQuery(‘body‘).width() * 0.87; jQuery(‘img‘).error(function(){ var self = jQuery(this); var org = self.attr(‘data-original1‘); self.attr("src", org); self.error(function(){ auto_remove(this); }); }); jQuery(‘img‘).each(function(){ var self = jQuery(this); var w = self.css(‘width‘); var h = self.css(‘height‘); w = w.replace(‘px‘, ‘‘); h = h.replace(‘px‘, ‘‘); if(w <= width){ return; } var new_w = width; var new_h = Math.round(h * width / w); self.css({‘width‘ : new_w + ‘px‘, ‘height‘ : new_h + ‘px‘}); self.parents(‘div.pic‘).css({‘width‘ : new_w + ‘px‘, ‘height‘ : new_h + ‘px‘}); }); }); } </script> </head> <body> <form name="form1" target="_blank"> <table border="1"> <TR><th>公众号ID</th> <th><INPUT value="wxf8b4f85f3a794e77" name="appId" id="1"></th> <tr><th>商户ID</th><th><INPUT value="1900000109" name="partnerId" id="2"></th> <TR><th>总金额</th><th><INPUT value=1 name="totalFee" id="3"></th> <TR><th>商品名</th><th><INPUT value="江诗丹顿" name="body" id="4"></th> </table> </form> <div class="WCPay"> <a id="getBrandWCPayRequest" href="javascript:void(0);"><h1 class="title">提交</h1></a> </div> </body> </html>
打开一看(楼主心里想TX你是多缺美工!),“提交”两字这么大,点一下试试,没反应?这不科学啊!立马找原因,当看到这句:“微信支付,是基于微信客户端提供的支付服务功能” ,楼主**(已和谐)了!放网站上用微信打开,这次有反应了!微信友情的提示我:“功能未授权”。。 这次知道是啥原因了,找客户沟通,原来合同快递还没到,保证金5W没交(现在只要2W了)。。
N天之后。。。。
这下测试能成功了,该怎么跟网站结合呢?不会直接把参数改了,然后让客户点提交吧?楼主想想这用户体验也太差了吧,客户肯定不认同。这问题纠结了楼主几天,百撕不得骑姐。有一天突然企业QQ一个讨论组的图标老闪,我就纳闷我没加过讨论组啊,打开正想喷(实际也真没喷过,能拉进讨论组都是好友,不过问题解不出来的时候确实很烦)的时候,人物列表那个头像怎么那么熟呢?那不我客户吗?瞬间一盆凉水从头到脚彻底没脾气了!A(TX商务人员):“你们的微信支付做好了没?”,我:“还没呢。”,A:"有什么困难吗?",我:“有,有一些地方不明白。”,A:"我帮你安排个技术支持吧?",楼主欣喜若狂啊,从看到这行信息到打出“好的”发出去绝对是没有超过1秒。。
之后楼主一帆风顺了,如鱼得水了,同事妹纸也变的水灵多了。。