微信支付接入(Android/IOS(swift)/Java后台)

本文章仅作为个人笔记

接入方式可参考微信登录接入

  • IOS端(swift):

    • 主要接入和代码可参考微信登录接入
      • 本人使用HandyJSON框架方便json处理,用于实例化服务器返回对象

              import HandyJSON
              
              class ResponseWX: HandyJSON {
              
                  var appid: String = "";
                  var partnerid: String = "";
                  var noncestr: String = "";
                  var packageName: String = "";
                  var prepayid: String = "";
                  var timestamp: UInt32 = 0;
                  var sign: String = "";
                  var orderNumber: String = "";
              
                  required init() {
                  }
              
              }
        
      • 创建支付回调类并实例化

              struct WechatPayBack: HttpUtilsBack {
                  func finish(result: String?, error: BaseError?) {
                      if error == nil {
                          //支付成功
                      } else {
                          //支付失败
                      }
                  }
              }
              //实例化支付回调及为AppDelegate的wechatPayBack赋值
              appDelegate?.wechatPayBack = WechatPayBack()
        
      • 调起支付关键代码

              //从服务器获取签名信息,这里只需要服务器处理即可。
              let result: ResponseWX = getResultFromService()
              //创建支付请求实例并调起支付。
              let req = PayReq()
              req.openID = result?.appid
              req.partnerId = result?.partnerid
              req.package = result?.packageName
              req.prepayId = result?.prepayid
              req.nonceStr = result?.noncestr
              req.timeStamp = result!.timestamp
              req.sign = result?.sign
              WXApi.send(req)
        
  • Android端:

    • 主要接入和代码可参考微信登录接入
    • 除按照微信登录方式接入外还需进行如下操作:
      • 创建 包名.wxapi.WXPayEntryActivity 文件,保证内容如下(WechartUtils下面会给出):

                  import android.app.Activity;
                  import android.os.Bundle;
                  import android.util.Log;
                  
                  import com.tencent.mm.opensdk.constants.ConstantsAPI;
                  import com.tencent.mm.opensdk.modelbase.BaseReq;
                  import com.tencent.mm.opensdk.modelbase.BaseResp;
                  import com.tencent.mm.opensdk.modelpay.PayResp;
                  import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
                  
                  public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
                  
                      public static final String APP_ID = "";//填入自己的appid
                      public static Back authBack;
                  
                      public interface Back {
                          public void onFiled(String errorMsg);
                  
                          public void onSuccess(String code, String state);
                      }
                  
                      public static void registAuthBack(Back back) {
                          authBack = back;
                      }
                  
                      public static void unregistAuthBack() {
                          authBack = null;
                      }
                  
                      @Override
                      protected void onCreate(Bundle savedInstanceState) {
                          super.onCreate(savedInstanceState);
                          WechartUtils.getInstance(this, APP_ID)
                                  .handleIntent(this, this);
                      }
                  
                      @Override
                      public void onReq(BaseReq baseReq) {
                          Log.e("-----1", "baseReq=" + baseReq);
                      }
                  
                      @Override
                      public void onResp(BaseResp baseResp) {
                          switch (baseResp.getType()) {
                              case ConstantsAPI.COMMAND_PAY_BY_WX:
                                  if (authBack != null) {
                                      // 0:成功; -1:错误; -2:用户取消;
                                      PayResp payResp = (PayResp) baseResp;
                                      if (payResp.errCode == 0) {
                                          authBack.onSuccess(String.valueOf(payResp.errCode), payResp.prepayId);
                                      } else {
                                          authBack.onFiled(baseResp.errStr);
                                      }
                                  }
                                  break;
                          }
                          finish();
                      }
                  
                      @Override
                      protected void onDestroy() {
                          super.onDestroy();
                          WechartUtils.getInstance(this, APP_ID)
                                  .unregisterApp(this);
                      }
                  
                  }
        
        • 创建WechartUtils文件用于公共处理支付

                  import android.app.Activity;
                  import android.util.Log;
                  
                  import com.tencent.mm.opensdk.modelmsg.SendAuth;
                  import com.tencent.mm.opensdk.modelpay.PayReq;
                  import com.tencent.mm.opensdk.openapi.IWXAPI;
                  import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
                  import com.tencent.mm.opensdk.openapi.WXAPIFactory;
                  
                  import java.util.concurrent.ConcurrentHashMap;
                  
                  public class WechartUtils {
                  
                      private static final WechartUtils wechartUtils = new WechartUtils();
                      private static final ConcurrentHashMap<String, IWXAPI> apis = new ConcurrentHashMap<>();
                  
                      private WechartUtils() {
                      }
                  
                      public static WechartUtils getInstance(Activity activity, String appId) {
                          if (activity != null
                                  && !apis.containsKey(activity.getLocalClassName())) {
                              IWXAPI api = WXAPIFactory.createWXAPI(activity, appId, true);
                              api.registerApp(appId);
                              apis.put(activity.getLocalClassName(), api);
                          }
                          return wechartUtils;
                      }
                  
                      public WechartUtils handleIntent(Activity activity
                              , IWXAPIEventHandler handler) {
                          apis.get(activity.getLocalClassName())
                                  .handleIntent(activity.getIntent(), handler);
                          return this;
                      }
                  
                      public void pay(Activity activity, String appId, String partnerId, String packageName
                              , String prepayId, String nonceStr, String timeStamp, String sign) {
                          if (activity == null) {
                              return;
                          }
                          PayReq req = new PayReq();
                          req.appId = appId;//appid
                          req.partnerId = partnerId;//微信支付分配的商户号
                          req.packageValue = packageName;//暂填写固定值Sign=WXPay
                          req.prepayId = prepayId;//微信返回的支付交易会话ID
                          req.nonceStr = nonceStr;//随机字符串
                          req.timeStamp = timeStamp;//时间戳
                          req.sign = sign;//签名
                          IWXAPI api = apis.get(activity.getLocalClassName());
                          if (api != null) {
                              api.sendReq(req);
                          }
                      }
                  
                      public void login(Activity activity) {
                          if (activity == null) {
                              return;
                          }
                          SendAuth.Req req = new SendAuth.Req();
                          req.scope = "snsapi_userinfo";
                          req.state = String.valueOf(System.currentTimeMillis());
                          IWXAPI api = apis.get(activity.getLocalClassName());
                          if (api != null) {
                              api.sendReq(req);
                          }
                      }
                  
                      public void unregisterApp(Activity activity) {
                          if (activity == null) {
                              return;
                          }
                          IWXAPI api = apis.get(activity.getLocalClassName());
                          if (api != null) {
                              api.unregisterApp();
                              apis.remove(activity.getLocalClassName());
                          }
                      }
                  
                  }
          
        • 在AndroidManifest.xml文件内注册activity

                  <activity
                      android:name=".wxapi.WXPayEntryActivity"
                      android:exported="true"
                      android:label="@string/app_name" />
          
        • 创建好工具文件后可以开始准备开发了,这里贴出主要使用伪代码。

                  public class DemoActivity extends Activity {
                      private WechartUtils wechartUtils;
                      @Override
                      protected void onCreate(Bundle savedInstanceState) {
                          //初始化工具
                          wechartUtils = WechartUtils.getInstance(this, WXPayEntryActivity.APP_ID);
                          //注册微信支付回调
                          WXPayEntryActivity.registAuthBack(new WXPayEntryActivity.Back() {
                              @Override
                              public void onFiled(String errorMsg) {
                                  //支付失败回调
                              }
                  
                              @Override
                              public void onSuccess(String code, String state) {
                                  //失败成功回调
                              }
                          });
                      }
                  
                      //开始微信支付方法
                      private void startWechatPay() {
                          //去服务器获取签名信息 具体返回的信息可查看后面的后台开发
                          WXResponse response = getWXResponse();
                          //调用wechartUtils的pay方法调起微信支付。
                          wechartUtils.pay(this, response.appid, response.partnerid
                                      , response.packageName, response.prepayid, response.noncestr
                                      , response.timestamp, response.sign);
                      }
                  
                      @Override
                      protected void onDestroy() {
                          //取消注册
                          wechartUtils.unregisterApp(this);
                          WXPayEntryActivity.unregistAuthBack();
                          super.onDestroy();
                      }
                  
                  }
          
  • java后台:

    • 主要接入和代码可参考 微信登录接入
    • 用户获取支付签名信息只需要调用WechartUtils.getWXResponse()方法,返回对象即可。第一个参数为商品名称,di
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容