一、微信授权登录
(1)当首次关注微信小程序的时候就需要进行授权登录
数据库要新建一张微信授权登录表,用来存储openid 和用户id,每个微信用户都有一个openid,通过code来获取openid,
每次进入小程序时,用openid来判断数据库微信授权登录表中是否存在当前用户的openid 如果存在就返回用户的登录信息,否则就进行授权,向微信登录表中插入一条信息
二、微信支付(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5# API文档)
使用微信支付 ,首先调用统一下单接口,通过统一下单接口返回订单id,给前端调用,
注意点:下单接口需要的参数是xml格式的参数,可以按照文档来进行。签名校验可以通过https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1来测试签名是否正确,通知地址如果不知道怎么给或者接受的话
可以先给一个能访问的空地址。
支付代码展示
/// <summary>
/// 支付模块 因小程序不能使用外部域名 所以将所有的外部域名放到后台操作,返回数据给前端
/// 根据API文档https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5
/// 调用支付接口前先调用微信统一下单接口https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1 返回预支付交易单prepay_id,然后前端调起支付
///
///
/// 首先按照API文档 传入xml参数给下单接口 ,下单接口返回xml数据,将xml数据转成json字符串,然后去json字符串中的值 ,将值返回给前端,前端调起支付
///
///
///
/// /// <summary>
/// 微信小程序支付流程
/// 商户在小程序中先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易后调起支付。
/// URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
/// 返回5个参数
/// appId,nonceStr,package,signType,timeStamp
/// </summary>
///
/// </summary>
/// <returns></returns>
///
[HttpGet]
public IEnumerable<Pay> pay(string openid, string OrderAmount)
{
IList<Pay> pays=new List<Pay>();
//token验证
string token = GetHeader("token");
if (!api.cdchuandong.com.App_Start.Memcached.KeyExists("APIUSERID_TOKEN_" + token))
{
Pay wxs = new Pay();
wxs.statucode = 404;
pays.Add(wxs);
return pays;
}
string num = GenarateCodes;
string out_trade_no = DateTime.Now.ToString("yyyyMMddHHmmssfff");
string ip = ClientInfo.CurrentIP;
//string stringA = "appid=wx0eac3f4a1fef6170&body=test&device_info=1000&mch_id=1494993252&nonce_str=" + num + "";
//string stringA = "appid=wx0eac3f4a1fef6170&body=test&device_info=1000&mch_id=1494993252&nonce_str=" + num + "¬ify_url=https://api.cdchuandong.com/api/CDMy/url&openid=on2cB5TZUfwl7Rx1exlxsvnYye9w&out_trade_no=" + out_trade_no + "&spbill_create_ip=" + ip + "&total_fee=1&trade_type=JSAPI&openid=" + openid + "";
string stringA = "appid=wx0eac3f4a1fef6170&body=传动网科技&device_info=1000&mch_id=1494993252&nonce_str=" + num + "¬ify_url=https://api.cdchuandong.com/api/CDMy/url&openid=" + openid + "&out_trade_no=" + out_trade_no + "&spbill_create_ip=" + ip + "&total_fee=" + int.Parse(OrderAmount) + "&trade_type=JSAPI";
string stringSignTemp = stringA + "&key=shenzhenchuandongwangkej20181126";
StringBuilder sb = new StringBuilder();
sb.Append("<xml>");
sb.Append("<appid>wx0eac3f4a1fef6170</appid>");
sb.Append("<body>传动网科技</body>");
sb.Append("<device_info>1000</device_info>");
sb.Append("<mch_id>1494993252</mch_id>");
sb.Append("<nonce_str>" + num + "</nonce_str>");
sb.Append("<notify_url>https://api.cdchuandong.com/api/CDMy/url</notify_url>");
sb.Append("<out_trade_no>" + out_trade_no + "</out_trade_no>");
sb.Append("<spbill_create_ip>" + ip + "</spbill_create_ip>");
sb.Append("<total_fee>" + int.Parse(OrderAmount) + "</total_fee>");
sb.Append("<trade_type>JSAPI</trade_type>");
sb.Append("<openid>" + openid + "</openid>");
sb.Append("<sign>" + MD5Comm.Md5Hash(stringSignTemp).ToUpper() + "</sign>");
sb.Append("</xml>");
//微信统一接口
string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
string data = sb.ToString();
//调用微信统一下单接口 返回需要xml的prepay_id
string p_idxml= PostXmlResponse(url,data);
//xml转json对象
XmlDocument doc = new XmlDocument();
doc.LoadXml(p_idxml);
string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc);
//获取预支付交易单prepay_id 获取json字符串中想要的值
var jObject = JObject.Parse(json);
var prepay_id = jObject["xml"]["prepay_id"]["#cdata-section"].ToString();
var nonce_str = jObject["xml"]["nonce_str"]["#cdata-section"].ToString();
Pay p = new Pay();
//获取时间戳
int time = (int)(DateTime.Now - DateTime.Parse("1970 - 1 - 1")).TotalSeconds;
p.timestamp = time.ToString();
//预支付交易单
string pid = "prepay_id=" + prepay_id + "";
p.prepay_id = pid;
//签名
string sin = "appId=wx0eac3f4a1fef6170&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id + "&signType=MD5&timeStamp=" + p.timestamp + "&key=shenzhenchuandongwangkej20181126";
p.paySign = MD5Comm.Md5Hash(sin);
//随机字符串
p.nonce_str = nonce_str;
pays.Add(p);
return pays;
}