JS调用微信API实现微信支付

最近在做微信公众号开发,在微信支付上遇到一些问题,困惑了3天,今天终于搞定。期间要感谢一些大神的帮助,趁热下面分享一下我的经验。

在实现微信支付之前,需要到微信开发平台认证,这些认证和配置信息我就不多说了,这里主要从代码层面实现支付。

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId" : "wx2421b1c4370ec43b",     //公众号名称,由商户传入    
           "timeStamp":" 1395712654",         //时间戳,自1970年以来的秒数    
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串    
           "package" : "prepay_id=u802345jgfjsdfgsdg888",     //统一订单号
           "signType" : "MD5",         //微信签名方式:    
           "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //支付签名
       },
       function(res){     <br>       alert(res.err_msg);
           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();
}

上面的JS代码是官方文档上贴出来的,官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7。

下面对JS中的几个参数做主要的讲解:

在开发过程中,有4个非常重要的参数:一个是appid,AppSecret,apikey和商户号。上面js中的appID就是其中之一。timeStamp是一个时间戳,10位数,nonceStr是随机数,32位以内,这里最重要的两个参数,也是最容易出错的就是package和paySign了。我一一说来。先说package,这里需要用到prepay_id,这个参数是微信生成的订单号,需要我们调用统一订单接口来获取。官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1。可以从文档看到,要获取prepay_id,需要很多参数,这里面有一个非常重要的参数就是签名。注意:这里的签名和JS中的支付签名和不同的。 签名的算法文档里有,我只是强调两点。一个是参数的顺序,一定一定要按照ASCII从小到大拼接,二是apikey一定不能错,这个apikey在哪里呢?登入商户平台就可以设置了。



拼接好签名需要的字符串后,进行MD5加密就可以得到签名了。然后把签名和前面所有的参数组合成xml格式的字符串,调用给的接口URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder就可以返回一个xml结果,解析出其中的prepay_id,这样这个参数就成功获取到了。
   下面再说JS中的最后一个参数PaySign:支付签名。支付签名的算法也是一样,把JS中的其他5个参数按照顺序拼接,加上apikey,MD5加密,ok。
签名的算法都是一样的,只是参数值不同而已。这里需要注意一点。在支付签名的时候,用到随机数nonceStr,时间戳timeStamp,而签名时使用的这两个参数和JS中的这两个参数的值要是一样的,是同一个随机数,同一个时间戳。为什么呢?虽然文档没说,但是我的理解是:支付签名是通过随机数和时间戳来生成的,然后在支付的时候,把随机数,时间戳,支付签名一起发送过去,那么在微信进行验证的时候,也会根基js中的随机数和时间戳生成签名和你发送的支付签名进行比较,如果你在js中重新获取新的随机数、时间戳,那么算出来的签名和你发送的签名就会不一样,就会报错:签名失败。
  到此,代码层面的注意点就这些,当然,还有其他的一些注意点。比如其中有用的openid,这个参数也是需要调用接口获取到的,还有支付授权的目录是否配置正确。
  最后一句总结:仔细看文档,最后问别人,可以找微信支付相关的群,里面很多大神的,我之前就是遇到一个问题纠结了2天没解决,(有时候光看文档也不行),
然后怒加了8个微信开发的群,最终在高人的指点下终于搞出来了。再次表示感谢。程序员是一个热爱分享的群体,他们非常乐意把自己知道的东西分享出去。所以不懂的时候,多问问。



在 NestJS 中集成微信 API 来发送消息通常涉及到以下几个步骤: 1. **创建公众号**:首先,你需要有一个微信公众号,如果是企业号或者服务号,需要完成相应的认证。 2. **获取开发者工具权限**:登录微信公众平台网站,获取AppID、AppSecret以及EncodingAESKey等关键配置信息。 3. **安装依赖**:在你的 NestJS 项目中,你可以使用 `@nestjs/wechat` 或者 `wechat-js-sdk` 这样的第三方模块来处理微信消息相关的操作。通过 npm 安装它们: ```bash npm install @nestjs/wechat wechat-js-sdk ``` 4. **设置配置**:在你的 NestJS 配置文件中(如 `.env` 或者 `config.ts`),添加微信API的相关配置: ```properties WECHAT_APP_ID=your_app_id WECHAT_APP_SECRET=your_app_secret ``` 5. **创建服务**:创建一个微服务来处理微信消息的接收和发送。这可能包括一个中间件用于处理微信服务器发来的事件,以及一个方法用于响应用户的消息请求: ```typescript import { Controller, Body, Post } from '@nestjs/common'; import * as Wechat from 'wechat-js-sdk'; @Controller() export class WechatController { private wxClient = new Wechat({ appid: process.env.WECHAT_APP_ID, timestamp: '', nonceStr: '', signature: '', jsApiList: ['sendMessage', 'getUserInfo'] }); @Post('message') async sendMessage(@Body() body: any) { // 解析并处理微信消息内容 this.wxClient.message(body).then(response => { console.log('Sent message:', response); }); } // 其他方法如处理事件接收... } ``` 6. **授权和验证**:为了接收到微信的消息,你需要在前端页面上初始化微信 JavaScript SDK,并在用户的点击事件中触发授权流程,确保服务器能够获得用户授权。 7. **测试与部署**:在本地环境中测试API,确保一切正常后再将应用部署到生产环境。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值