# 微信支付文档
## 配置
```js
var AngerWechat = require('anger-wechat')
var weixinApi = new AngerWechat({
    appId: '[your appId]', // appId
    appSecret: '[your appSecret]', // appSecret
    authUrl: 'http://www.test.cc/get-weixin-code.html', // 微信auth2.0授权公共页面
    payment: { // 可选 如果需要支付模块的话
        mchId: '123456',
        partnerKey: '456789',
        pfx: path.join(__dirname, 'apiclient_cert.p12'), //【可选】证书路径，不传大多接口掉不了
        notifyUrl: '' // 【可选】微信支付接受到结果
    }
})

// 支付挂载在 weixinApi.angerPay ...
```
## api列表
* `angerPay.scanCodePayment` <a href="#scancodepayment">刷卡支付</a>
* `angerPay.orderQuery` <a href="#orderQuery">查询订单</a>
* `angerPay.brandPay` <a href="#brandPay">付钱</a>
* `angerPay.refund` <a href="#refund">退款</a>
* `angerPay.sendRedPacket` <a href="#sendRedPacket">发红包</a>
* `angerPay.redPacketQuery` <a href="#redPacketQuery">查询红包状态</a>
* `angerPay.transfers` <a href="#transfers">企业付款</a>
* `angerPay.downloadBill` <a href="#downloadBill">查询历史订单</a>



### scanCodePayment
刷卡支付 <a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1">官方文档地址</a>  

![刷卡支付](https://pay.weixin.qq.com/wiki/doc/api/img/chapter5_1_0.jpg)

```js
let callback = await weixinApi.angerPay.scanCodePayment({
    body: '商品描述',//【必传】商品描述
    out_trade_no: 'lol1217752501201407033233368020', //【必传】商户订单号
    total_fee: 1, //【必传】收款价格，单位（分）
    spbill_create_ip: '127.0.0.1',//【必传】终端IP
    auth_code: '100000000000',//【必传】付款码
    device_info: '',//【选传】设备号
    sign_type: '',//【选传】签名类型
    detail: '',//【选传】商品详情
    attach: '',//【选传】附加数据
    fee_type: '',//【选传】货币类型
    goods_tag: '',//【选传】订单优惠标记
    limit_pay: '',//【选传】指定支付方式
    time_start: '',//【选传】交易起始时间
    time_expire: '',//【选传】交易结束时间
    scene_info: '',//【选传】场景信息
})
```
<br>
<br>  

### orderQuery
查询订单 <a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2">官方文档地址</a>  
```js
let callback = await weixinApi.angerPay.orderQuery({
    out_trade_no: 'lol1217752501201407033233368020',//【必传】订单号
})
```
<br>
<br>  

<hr>
> ❤注：以下方法和文档均继承自 <a href="https://github.com/supersheep/wechat-pay">wechat-pay</a>  后续时间会继续完善。  
<hr>

### brandPay
付钱
```js
let callback = await weixinApi.angerPay.brandPay({
  body: '吮指原味鸡 * 1',
  attach: '{"部位":"三角"}',
  out_trade_no: 'kfc' + (+new Date),
  total_fee: 10 * 100,
  spbill_create_ip: req.ip,
  openid: req.user.openid,
  trade_type: 'JSAPI'
})
```  

注：
1. 页面的路径需要位于`支付授权目录`下
2. 由于每次呼出支付界面，无论用户是否支付成功，out_trade_no 都会失效（OUT_TRADE_NO_USED），所以这里使用timestamp保证每次的id不同。业务逻辑中应该自行维护之  

<br>
<br>  

前端通过

```javascript
WeixinJSBridge.invoke('getBrandWCPayRequest', payargs, function(res){
  if(res.err_msg == "get_brand_wcpay_request:ok"){
    alert("支付成功");
    // 这里可以跳转到订单完成页面向用户展示
  }else{
    alert("支付失败，请重试");
  }
});
```
来呼出微信的支付界面

### 接收微信付款确认请求  

```javascript

app.use('<notifyUrl>', weixinApi.angerPay.middleware(initConfig).getNotify().done(function(message, req, res, next) {
  var openid = message.openid;
  var order_id = message.out_trade_no;
  var attach = {};
  try{
   attach = JSON.parse(message.attach);
  }catch(e){}

  /**
   * 查询订单，在自己系统里把订单标为已处理
   * 如果订单之前已经处理过了直接返回成功
   */
  res.reply('success');

  /**
   * 有错误返回错误，不然微信会在一段时间里以一定频次请求你
   * res.reply(new Error('...'))
   */
}));
```
<br>
<br>

### refund
退款
```js
let callback = await weixinApi.angerPay.refund({
  out_trade_no: "kfc001",
  out_refund_no: 'kfc001_refund',
  total_fee: 10 * 100,
  refund_fee: 10 * 100
})
```

<br>
<br>

### 接收退款确认请求

```javascript

app.use('<notifyUrl>', weixinApi.angerPay.middleware(initConfig).getRefundNotify().done(function(message, req, res, next) {
  var openid = message.openid;
  var refund_order_id = message.out_refund_no;
  var order_id = message.out_trade_no;
  var attach = {};
  try{
   attach = JSON.parse(message.attach);
  }catch(e){}

  /**
   * 查询订单，在自己系统里把订单标为已处理
   * 如果订单之前已经处理过了直接返回成功
   */
  res.reply('success');

  /**
   * 有错误返回错误，不然微信会在一段时间里以一定频次请求你
   * res.reply(new Error('...'))
   */
}));
```

<br>
<br>

### sendRedPacket
发红包
```js
let callback = await weixinApi.angerPay.sendRedPacket({
  mch_billno: 'kfc002',
  send_name: '肯德基',
  re_openid: '',
  total_amount: 10 * 100,
  total_num: 1,
  wishing: '祝多多吃鸡',
  client_ip: '',
  act_name: '吃鸡大奖赛',
  remark: '记得吐骨头',
  scene_id: 'PRODUCT_1'
})
```
<br>
<br>  

### redPacketQuery  

查询红包状态  

```js
let callback = await weixinApi.angerPay.redPacketQuery({
  mch_billno: 'kfc002'
})
```
<br>
<br>

### transfers
企业付款
```js
let callback = await weixinApi.angerPay.transfers({
  partner_trade_no: 'kfc003',
  openid: '',
  check_name: 'NO_CHECK',
  amount: 10 * 100,
  desc: '',
  spbill_create_ip: ''
})
```
根据微信文档，当返回错误码为“SYSTEMERROR”时，一定要使用原单号重试，否则可能造成重复支付等资金风险。
<br>
<br>
### downloadBill
查询历史订单
```js
let callback = await weixinApi.angerPay.downloadBill({
  bill_date: "20140913",
  bill_type: "ALL"
})
```
<br>
<br>



