unity微信支付接入总结(客户端下单)

xiaoxiao2021-02-28  84

unity微信支付接入总结(客户端下单): 接入之前看了下接入流程、找了篇文档(Android支付系列)、突然发现(我去,客户端干的活真少,真happy)然后屁颠屁颠的去找服务器要数据去了 然后服务器给了个回调地址,让客户端调用统一下单接口….. 于是就辛辛苦苦的又找了一篇教程(安卓 集成微信支付和支付宝)应为要在unity中使用把他的工程下了下来自己又整理了一下(纯新手的话 一些导入导出,unity、android交互之类的话 可以参考上一篇博客) 一、先创建了一个unity项目,添加一个按钮、一个text用于调试,将unity导出Android包导入到eclipse 中、导入libammsdk.jar包 二、用到的脚本 还有一个WXPayEntryActivity (1)ParameterConfig脚本 中的API密钥 不是 AppSecrect 是自己在商户平台设置中的API安全中设置的 签名错误很大原因就是这个不对 (2)MainActivity 中添加untiy 调用的方法和调unity的方法

public class MainActivity extends UnityPlayerActivity { private static final String WX_APPID ="自己的id"; private OrderInfo orderInfo; private IWXAPI mWxApi; private Goods goods; private String ip; private int count; private int id; private void regToWx() { mWxApi = WXAPIFactory.createWXAPI(this,WX_APPID,true); mWxApi.registerApp(WX_APPID); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //requestWindowFeature(1); //setContentView(0x7f040005); regToWx(); } private String intToIp(int i) { return (i & 0xFF ) + "." + ((i >> 8 ) & 0xFF) + "." + ((i >> 16 ) & 0xFF) + "." + ( i >> 24 & 0xFF) ; } private void initData() { orderInfo=(OrderInfo) getIntent().getSerializableExtra("data"); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } protected void onRestart() { super.onRestart(); } protected void onResume() { super.onResume(); } protected void onPause() { super.onPause(); } protected void onStop() { super.onStop(); } protected void onDestroy() { super.onDestroy(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); int code=intent.getIntExtra("result", 1); switch (code) { case 0://表示成功 finish(); break; case -1://表示失败 finish(); break; case -2:表示取消 finish(); break; case 1://未知不做处理 break; default: break; } } //支付调用 public void Pay1(int idtemp,String iptemp,int itemID,int price,String name) { //后面下面需要用到的值,通过order传了次没有成功就直接 //在参数类中临时存了一下 ParameterConfig.id =idtemp+""; ParameterConfig.ip=iptemp; ParameterConfig.price =price+""; ParameterConfig.name =name; ParameterConfig.itemId =itemID+""; goods = new Goods(); goods.productid=itemID; goods.productname=name; goods.discountprice=price; count=1; initData(); submit(); } public void ATU(String Message) { UnityPlayer.UnitySendMessage("Main Camera", "Message", Message); } public void Pay() { if (!isWeixinAvilible(this)) { Toast.makeText(this, "请先安装微信或者选择其他支付方式",0).show(); return; } //微信支付 Log.e("pay", "payByWXb"); payByWX(handler,orderInfo); Log.e("pay", "payByWXe"); } Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case 9000://支付宝支付成功 Intent it; finish(); break; case 8000://支付宝支付失败 finish(); break; default: break; } } }; /** * 调用微信支付 * @param handler * @param orderInfo2 */ private void payByWX(Handler handler, OrderInfo order) { Log.e("payByWX", "调用微信支付b"); WXpayUtil wxpay=new WXpayUtil(this,order); Log.e("payByWX", "调用微信支付e"); } /** * 提交订单 * @param v */ public void submit() { final OrderInfo orderInfo=new OrderInfo(); orderInfo.userid=id; orderInfo.areacode=23; orderInfo.buildno="10"; orderInfo.roomno=ip; orderInfo.producttypeid=goods.producttypeid; orderInfo.productid=goods.productid; orderInfo.amount=goods.discountprice;//单价 orderInfo.account=count;//数量 //orderInfo.totalamount=Arith.mul(goods.discountprice, count); //double offsetamount;//抵扣金额 //orderInfo.score=count*goods.score; //int assessitem;//评价项 //int assesslevel;//评价级别 //String assesscontent;//评价内容 //long payid=;//支付编号 orderInfo.status=2;//支付状态待付款 orderInfo.type=11;//日用品 //orderInfo.usermemo =sayEt.getText().toString();//业主备注 //orderInfo.address =adress; orderInfo.productname =goods.productname;// orderInfo.desccontext =goods.productdescription;// orderInfo.outtradeno=System.currentTimeMillis()+""+orderInfo.userid; orderInfo.merchantid=goods.companyid; submitorder(orderInfo); } /** * 订单提交成功,进入付款界面 * @param orderInfo * @return */ private void submitorder(OrderInfo orderInfo) { Log.e("submitorder","订单提交成功,进入付款界面"); Pay(); } /** * 检查微信是否存在 * @param context * @return */ public boolean isWeixinAvilible(Context context) { PackageManager packageManager = context.getPackageManager();// 获取packagemanager List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息 if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName; System.out.println(pinfo.get(i).packageName); if (pn.equals("com.tencent.mm")) { return true; } } } return false; } public void loginWeixin(String ss) { // 发送授权登录信息,来获取code SendAuth.Req req = new SendAuth.Req(); // 应用的作用域,获取个人信息 req.scope = "snsapi_userinfo"; /** * 用于保持请求和回调的状态,授权请求后原样带回给第三方 * 为了防止csrf攻击(跨站请求伪造攻击),后期改为随机数加session来校验 */ req.state = "app_wechat"; mWxApi.sendReq(req); } }

(3)WXpayUtil 如果有很多http 之类的错误 无类可以引用的话 ,可以更改android 的sdk 版本试试,我用的是android5.0.1 在引用library界面更改

private String genProductArgs() { StringBuffer xml = new StringBuffer(); try { String nonceStr = genNonceStr(); xml.append("</xml>"); List<NameValuePair> packageParams = new LinkedList<NameValuePair>(); Log.e(TAG, "1"); packageParams.add(new BasicNameValuePair("appid", ParameterConfig.WX_APP_ID)); Log.e(TAG, "2"+ParameterConfig.WX_APP_ID); String str = ParameterConfig.id+"_"+ParameterConfig.itemId+"_"+System.currentTimeMillis(); packageParams.add(new BasicNameValuePair("attach",str)); packageParams.add(new BasicNameValuePair("body",ParameterConfig.name)); Log.e(TAG, "3"+111); packageParams.add(new BasicNameValuePair("mch_id", ParameterConfig.WX_MCH_ID)); Log.e(TAG, "4"+ParameterConfig.WX_MCH_ID); packageParams.add(new BasicNameValuePair("nonce_str",nonceStr)); Log.e(TAG, "5"+nonceStr); packageParams.add(new BasicNameValuePair("notify_url","")); Log.e(TAG, "6"+ParameterConfig.WX_notifyUrl); packageParams.add(new BasicNameValuePair("out_trade_no",genOutTradNo())); Log.e(TAG, "7"+"201704181010"); packageParams.add(new BasicNameValuePair("spbill_create_ip",ParameterConfig.ip)); Log.e(TAG, "8"+"1"); packageParams.add(new BasicNameValuePair("total_fee",ParameterConfig.price)); Log.e(TAG, "9"+ "1"); packageParams.add(new BasicNameValuePair("trade_type", "APP")); Log.e(TAG, "10"+"APP"); String sign = genPackageSign(packageParams); packageParams.add(new BasicNameValuePair("sign", sign)); String xmlstring =toXml(packageParams); return new String(xmlstring.toString().getBytes(), "ISO8859-1"); //return xmlstring; } catch (Exception e) { Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage()); return null; } }

通过大量的log.e来排除参数错误造成的签名失败原因.(在ddms下看调试信息) (4)WXPayEntryActivity

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{ private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity"; public static MainActivity mainActivity; Context mContext = null; // public WXPayEntryActivity(Activity activity) { // mainActivity = (MainActivity) activity; // } private IWXAPI api; private static final String APP_ID = "自己的appid"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.pay_result); //mContext = this; api = WXAPIFactory.createWXAPI(this, APP_ID); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { Log.e(TAG, "onPayFinish, errCode = " + resp.errCode); finish(); }

finsh()是用来结束当前activity 三、如果项目还需要接入sharesdk 项目要是还需要接入sharesdk的话如果,sharesdk libs下面的DemoCallback 用的是自带的就会发现,调不出来支付界面,或者调出来支付界面,微信登陆不上,这时候需要重新打一个DemoCallback.jar 把包命替换上自己的包命就ok了, 我是先把DemoCallback解压缩,然后反编译(用的uudejave),然后复制了一下脚本重新打了个

转载请注明原文地址: https://www.6miu.com/read-49870.html

最新回复(0)