이 글에서는 주로 nodejs WeChat 공용 계정 결제 개발에 대해 자세히 소개하며, 이는 특정 참고 가치가 있습니다. 관심 있는 친구는
odeJs WeChat 공용 계정 기능 개발, 모바일 H5 페이지에서 WeChat의 결제 기능을 참조할 수 있습니다. 지난 며칠 동안 회사의 결제 요구 사항 완료 요구에 따라 노드 및 h5 페이지를 사용하여 WeChat의 결제 기능을 호출했습니다. 이제 더 많은 개발자가 WeChat 결제 기능 개발을 성공적으로 완료할 수 있도록 개발 프로세스를 다시 살펴보겠습니다. (WeChat은 아직 노드 결제 기능을 제공하지 않습니다.)
1. 코드 요청
코드 요청의 목적은 사용자의 openid(현재 사용자의 상대적인 ID)를 얻는 것입니다. 공식 계정 고유 식별자) 및 access_token, 요청된 API: open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type= code&scope=snsapi_userinfo&state =STATE#wechat_redirect
이 API는 여러 매개변수에 주의해야 합니다.
1. appid 공식 계정의 appid는 공식 계정에서 확인할 수 있습니다
2. Redirect_uri WeChat 콜백 주소를 사용자 지정하면 위 주소를 요청한 후 WeChat이 정의한 Redirect_uri 주소로 이동합니다. 여기에서 Redirect_url에는 **url_encode** *php*가 필요합니다. * *encodeURLComponent(url)** 인코딩
3. response_type=code에 대해서는 딱히 할 말이 없고, response_type=code만 수정했습니다. 자세한 지침은 WeChat 공식 웹사이트에서 지침을 확인하세요
4. 범위=snsapi_userinfo, 이렇게 작성하세요. 자세한 지침은 위챗 공식 홈페이지에서 지침을 확인하세요
5. state=STATE, 이렇게 작성하세요. 자세한 지침은 지침을 확인하세요. 위챗 공식 홈페이지
6. wechat_redirect 이렇게 적어주시면 자세한 안내는 위챗 공식 홈페이지에서 확인하실 수 있습니다. 참고
ps: 공식 홈페이지 링크:
2. 코드를 통해 access_token, openid 가져오기
첫 번째 단계는 코드 값을 가져오는 것이었고 다음 단계는 코드를 통해 access_token 및 openid 값을 가져오는 것입니다.
API api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
여기에서 API의 매개변수 설명:
1. WeChat 공개 계정 배경에서 얻은 WeChat 공개 계정 ID
2. WeChat 공개 계정 배경에서 얻은 비밀 WeChat 공개 계정 키
3. 코드, 첫 번째 단계는 사용된 코드를 가져오는 것입니다
4 . grant_type=authorization_code
3. access_token >access_token을 통해 인터페이스
4. 웹페이지에서
이거 보면 이제 거의 끝나가는 느낌이 드시나요? 웹페이지에서 위챗 결제 기능만 호출하면 끝이겠죠? 아니요, 닫지도 마세요WeChat 브라우저에서 H5 웹페이지를 열고 JS를 실행하여 결제를 활성화하세요. 인터페이스의 입출력 데이터 형식은
JSON입니다. 참고: WeixinJSBridge 내장
객체 는 다른 브라우저에서는 유효하지 않습니다. 샘플 코드는 다음과 같습니다.
function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 "package" : "prepay_id=u802345jgfjsdfgsdg888", "signType" : "MD5", //微信签名方式: "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 } ); } if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } }else{ onBridgeReady(); }
{ "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 "package" : "prepay_id=u802345jgfjsdfgsdg888", "signType" : "MD5", //微信签名方式: "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 }
라는 매개변수를 전달해야 합니다. 매개변수 설명:
1. appId // 판매자가 전달한 공식 계정 이름 2. timeStamp // 타임스탬프, 1970년 이후의 초 수. 여기서는 특별한 주의가 필요합니다. ,
문자열<이어야 합니다. 🎜>의 타임스탬프 형식은 ""따옴표여야 함을 의미합니다. 3.nonceStr //임의의 문자열 32비트, 방법은 추후 제공됩니다4 . signType //WeChat 서명 방법: MD5
5. paySign //WeChat 서명을 입력한 다음
6. **패키지** //가장 중요합니다. 어디서 얻었나요? 다음.
ps: 공식 웹사이트 인터페이스 설명
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
WeChat의 통합 주문 인터페이스에서 prepay_id를 받으세요공식 API:
api.mch.weixin.qq.com/pay/unified 请求参数一堆, 但是有一些不是必须的,下面是必须参数 微信的统一下单接口要求传递的是 xml 的数据, 而且数据还需要签名, 那么首先吧数据签名。 生成签名后需要吧数据组装为xml 的格式: 接下来就是请求 api 获取prepay_id的值了, 将上面得到的 xml 数据请求下面的 api 发送给微信, 微信验证数据没问题后会放回你想要的值。 六. 获取到了prepay_id是不是就可以在 h5 段直接调用微信的支付了么? 答案是还不可以。 获取到了prepay_id那么现在h5 呼起微信的支付功能的参数是这样的: 有了这样的参数, 那么你还需要吧所有参与的参数做签名。签名规跟上面的一样,生成了签名后需要吧签名的参数 paySign 赋给h5 呼起微信的支付功能的参数(也就是微信的签名不参与签名的生成) 如果你的各个环节都没有问题, 那么得到了这样参数后你就可以正常的调用起微信的支付功能, 跟原生的功能是没有任何的差别的,(估计你现在的心里也特高兴吧, 没有 app 竟然可以使用 app 的功能,就是这么的神奇)。 七.支付完成的回调 微信支付完了后会在 h5 页面的微信支付的回调函数里面放回值, 根据自己的业务逻辑解析这个 xml 格式的数据就好了。 小坑:node ,express 框架开发, 如果你在微信的支付成功后的回调中没有获取到任何 xml 的值, 那么你需要安装一组件:body-parser-xml, 你可以使用 npm install body-parser-xml --save 安装, 在 app.js 里面require('body-parser-xml')(bodyParser);,使用中间件的方式 这样你就可以正常的获取到微信的 xml 数据了。 使用方法:
ord어{
appid : APPID,
attach : ATTACH,
body : BODY,
mch_id : MCH_ID,
nonce_str: NONCE_STR,
notify_url : NOTIFY_URL,// 微信付款后的回调地址
openid : OPENID,
out_trade_no : OUT_TRADE_NO ,//new Date().getTime(), //订单号
spbill_create_ip : SPBILL_CREATE_IP , //客户端的 ip
total_fee : TOTAL_FEE, //商品的价格, 此处需要注意的是这个价格是以分算的, 那么一般是元, 你需要转换为 RMB 的元
trade_type : 'JSAPI',
}
签名规则可以参考微信给出的签名规则(签名方法一会给出)
微信官方签名规则:
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3var body = '<xml> ' +
'<appid>'+config.wxappid+'</appid> ' +
'<attach>'+obj.attach+'</attach> ' +
'<body>'+obj.body+'</body> ' +
'<mch_id>'+config.mch_id+'</mch_id> ' +
'<nonce_str>'+obj.nonce_str+'</nonce_str> ' +
'<notify_url>'+obj.notify_url+'</notify_url>' +
'<openid>'+obj.openid+'</openid> ' +
'<out_trade_no>'+obj.out_trade_no+'</out_trade_no>'+
'<spbill_create_ip>'+obj.spbill_create_ip+'</spbill_create_ip> ' +
'<total_fee>'+obj.total_fee+'</total_fee> ' +
'<trade_type>'+obj.trade_type+'</trade_type> ' +
'<sign>'+obj.sign+'</sign> ' + // 此处必带签名, 否者微信在验证数据的时候是不通过的
'</xml>';
api : api.mch.weixin.qq.com/pay/unifiedorder{
"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
}
最后的参数是这样子的:{
"appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信签名方式:
"paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
}
res.err_msg == "get_brand_wcpay_request:ok" ,这样就是成功了, 但是不是就完事儿了呢 ? 也不是,为什么呢? 微信真的收到钱了么? 收到的钱是不是你传递给微信的值呢 ?你还需要将支付的结果写数据库什么的,这些都是未知。还记的在统一下单接口中有个必须参数就是 notify_url : NOTIFY_URL,// 微信付款后的回调地址 这个地址是用户传递给微信的, 微信在收到用户的付款后会以 post 的方式请求这个接口,微信会传递用户付款的信息过来, 不过是 xml 格式的。
类系这样的 xml 格式:<xml>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<attach><![CDATA[支付测试]]></attach>
<bank_type><![CDATA[CFT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
<openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
<out_trade_no><![CDATA[1409811653]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
<sub_mch_id><![CDATA[10000100]]></sub_mch_id>
<time_end><![CDATA[20140903131540]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>
注意:这里你在获取到数据后微信需要得到你的回应, 如果你一直不回应微信, 微信会请求你好几次, 这样估计你的逻辑会有问题吧,所以你需要给微信返回 xml 的格式的 回应。<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
// 解决微信支付通知回调数据
app.use(bodyParser.xml({
limit: '2MB', // Reject payload bigger than 1 MB
xmlParseOptions: {
normalize: true, // Trim whitespace inside text nodes
normalizeTags: true, // Transform tags to lowercase
explicitArray: false // Only put nodes in array if >1
}
}));
pay.getAccessToken({
notify_url : 'http://demo.com/', //微信支付完成后的回调
out_trade_no : new Date().getTime(), //订单号
attach : '名称',
body : '购买信息',
total_fee : '1', // 此处的额度为分
spbill_create_ip : req.connection.remoteAddress,
}, function (error, responseData) {
res.render('payment', {
title : '微信支付',
wxPayParams : JSON.stringify(responseData),
//userInfo : userInfo
});
});
就到这里吧, 感觉也差不多了。如有不对的地方还请指正。
【相关推荐】
1. 特别推荐:“php程序员工具箱”V0.1版本下载
2. 微信小程序完整源码
위 내용은 Nodejs, WeChat 결제 기능 개발의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!